Deutsches AutoHotkey Homepage AutoHotkey Community
Wir helfen uns gegenseitig aus der Patsche
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Steuerung von 20 Scripts, die auf das Window warten
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Ich brauche Hilfe!
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
MEC



Anmeldedatum: 01.08.2008
Beiträge: 67

BeitragVerfasst am: Di Aug 19, 2008 8:04 pm    Titel: Steuerung von 20 Scripts, die auf das Window warten Antworten mit Zitat

Hallo,

brauch mal Rat, ob man es so wie beschieben löst oder sich eine andere Vorgehensweise als wesentlich BESSER anbietet, weil weniger Systembelastung erzeugend. Da das Ganze auf sehr unterscheidlich ausgestatteten PCs (eben grad so für die Applikation ausreichend) laufen soll, würden mir auch Tests auf meiner Kiste nichts bringen.

Hintergrund:
Habe in einer Applikation ca. 20 MDI-Windows. Dafür gibt es die gleiche Anzahl Scripte, die irgendwelche Ergänzungen / Optimierungen für das jeweilige Window übernehmen.
Aufruf der MDI-Windows erfolgt über Menüleiste und POPUP-Fenster oder Icon.

Ideal wäre, wenn ich den jeweiligen Window-Aufruf im POPUP durch einen eigenen Eintrag ersetzen könnte, der zuerst das Script startet und dieses dann das Window aufruft.
Dafür scheint es aber nach allem was ich gefunden habe keine Lösung zu geben - oder?

Also muss der WinWait den Start des Windows überwachen.
Würde es Sinn geben, den WinWait zusätzlich in einen SetTimer zu setzen oder ist dies völliger Quatsch?

Bin mir nicht sicher was passiert, wenn 20 Scripte gleichzeitig mit einem WinWait unterwegs sind. Ist dies schon die Lösung oder gibt es andere Vorgehensweisen, welche die Systembelastung möglichst gering halten.

Ein Aufruf / Start der Scripte durch Hotkeys scheidet aus!

MEC
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
BoBo²
Gast





BeitragVerfasst am: Di Aug 19, 2008 8:17 pm    Titel: Antworten mit Zitat

Zitat:
brauch mal Rat, ob man es so wie beschieben löst
Hier hat eine Beschreibung praktisch den Wert einer Sekundärquelle - mit allen Schwächen. Gerade bei nem etwas umfangreicheren Projekt dürfte die Vorgehensweise mit der stückweisen Abarbeitung der Einzelkomponenten vorgegeben sein. Wie sagte schon die Milkakuh: "Der Code machts". Wann sehen wir den?
Nach oben
MEC



Anmeldedatum: 01.08.2008
Beiträge: 67

BeitragVerfasst am: Di Aug 19, 2008 8:42 pm    Titel: Antworten mit Zitat

Zitat:
Hier hat eine Beschreibung praktisch den Wert einer Sekundärquelle - mit allen Schwächen. Gerade bei nem etwas umfangreicheren Projekt dürfte die Vorgehensweise mit der stückweisen Abarbeitung der Einzelkomponenten vorgegeben sein. Wie sagte schon die Milkakuh: "Der Code machts". Wann sehen wir den?

Ne BoBo²,

es geht nicht um was und wieviel in dem jeweiligen Script drin ist. Jedes Script (wobei ich die 20 noch nicht fertig hab sondern derzeit erst 4) handelt die Dinge zu einem Window ab. Das geht von zusätzlichen Buttons in dem Window, über weitere eigene GUI,s um aus 7 nachgeschalteten Eingabefenster 1 Fenster zu machen...
Ich hab kein Problem die Scripte zu zeigen, geht aber aber an meiner Frage völlig vorbei!

Ich möchte dem Benutzer ein vernünftiges Handling bieten. Der klickt heute auf einen Menüpunkt oder ein Icon und seine Maske geht auf. So - jetzt hab ich zu dieser Maske ein Script, was zusätzliche Features anbietet. Ber Benutzer will dies nicht zusätzlich starten, denn er hat ja schon seine Maske aus der Menüleiste angewählt.

Da ich keine Befehle gefunden habe um die Menüleiste mit den POUPs anzupassen = Ersetze Maskenaufruf durch Scriptstart = müssen meine Scripte also gestartet sein und selbst überwachen ob für sie jetzt was zu TUN wäre = WinWait.

So und hier die Frage: Nimmt man in so einem Fall den WinWait und/oder setzt diesen zusätzlich in einen SetTimer oder wie könnte man es machen!?

MEC
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
BoBo²
Gast





BeitragVerfasst am: Di Aug 19, 2008 9:04 pm    Titel: Antworten mit Zitat

Zitat:
So und hier die Frage: Nimmt man in so einem Fall den WinWait und/oder setzt diesen zusätzlich in einen SetTimer oder wie könnte man es machen!?
Radio Erivan: "Im Prinzip ja, ...".
Suche bitte mal im Forum nach MDI. Dort wird die Problematik en detail beschrieben. Mögliche Lösungen inklusive.
Nach oben
BoBo²
Gast





BeitragVerfasst am: Di Aug 19, 2008 9:09 pm    Titel: Antworten mit Zitat

Hab gerade meinen eigenen Rat verfolgt, und dabei festgestellt das die von mir vorgeschlagenen Pages ja auf einer früheren Anfrage von dir basieren. ... Shocked
Nach oben
denick



Anmeldedatum: 15.09.2006
Beiträge: 1230
Wohnort: Berlin

BeitragVerfasst am: Mi Aug 20, 2008 5:27 am    Titel: Antworten mit Zitat

Moin,

ich glaube nicht, dass WinWait eine nennenswerte Systemlast erzeugt.

Eine mögliche Alternative wäre, in einem "Mutterskript" per Loop oder Timer die Fenster abzuchecken und die zugehörigen Skripte bei Bedarf zu starten.
_________________
Hilfe zur Hilfe

(de)nick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MEC



Anmeldedatum: 01.08.2008
Beiträge: 67

BeitragVerfasst am: Mi Aug 20, 2008 2:12 pm    Titel: Antworten mit Zitat

thx für die Antworten.

Werd es für die Windows mit eigener ahk_class erstmal über SetTimer mit WinWait angehen:
Code:
WinWait , AppName ahk_class TWDXMainForm   ; warten bis Applikation aktiv - MDI Parent
; SetTimer für alle Windows mit eigener ahk_class
SetTimer , DB, 250                     
SetTimer , Systemeinstellung, 250
SetTimer , Form1, 250

; Prüfung ob MDI-Child aktiv ist noch völlig offen!!!!
return

;Prüfung, ob Maske-DB aktiv
DB:
IfWinActive, AppName ahk_class TPrefsLOCForm
{
   SetTimer , Systemeinstellung, OFF
   SetTimer , Form1, OFF
   Msgbox  DB aktiv      ; Hier mein Programmablauf für DB.....
   WinWaitClose , AppName ahk_class TPrefsLOCForm
   msgbox DB ende
   SetTimer , Systemeinstellung, ON
   SetTimer , Form1, ON
}
return
.
.
.


Die Prüfung wie ich einen aktiven MDI-Child feststelle ist noch völlig offen. Hab bisher nichts passendes gefunden.

Falls ich nichts mehr finde, werde ich wohl die Applikations-Menüleiste "rauswerfen" und eine eigene Auswahlleiste erstellen müssen.

MEC
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MEC



Anmeldedatum: 01.08.2008
Beiträge: 67

BeitragVerfasst am: Mi Aug 20, 2008 4:56 pm    Titel: Antworten mit Zitat

Manchmal muss mann nur Glück haben!

Durch Zufall ist mir bei der Benutzung von toralfs AHK Window Info aufgefallen, dass in dem Feld "Fast Visible Text" immer als erstes mein gerade aktives MDI angezeigt wird. Idea

toralfs Script angeschaut, Befehle umgestellt und angepasst ... und hier ist ein Script, dass mir das aktive Window auch von MDI-Windows ermittelt!

Code:
#Persistent
#WinActivateForce
#NoEnv
settitlematchmode 1

WindowControlTextSize = 32767  ; Must be 32767 or less or it won't work on Windows 95.
VarSetCapacity(WindowControlText, WindowControlTextSize)

WinWait , myAppName   ;warten bis Applikation aktiv
SetTimer, ActiveMDI, 200
return

ActiveMDI:
WinGet , ListOfControlHandles, ControlListHwnd, myAppName
Loop , Parse, ListOfControlHandles, `n
{
   DllCall("GetWindowText", "uint", A_LoopField, "str", WindowControlText, "int", WindowControlTextSize)
   If (WindowControlText <> "")
   {
      tooltip , aktiver MDI-Child ist: %WindowControlText%
      return
   }
}
return


Jetzt habe ich den Ansatz um meine Abläufe in den Griff zu bekommen. Very Happy
thx toralf

22.08. Script weiter gekürzt und als lauffähiges Beispiel eingestellt.

MEC


Zuletzt bearbeitet von MEC am Fr Aug 22, 2008 3:09 pm, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
BoBo²
Gast





BeitragVerfasst am: Mi Aug 20, 2008 6:59 pm    Titel: Antworten mit Zitat

Na dann, bitte schön aufbereiten und ab damit in die Sektion Scripte & Funktionen Very Happy

* und Referenz auf Toralf nicht vergessen Wink
Nach oben
MEC



Anmeldedatum: 01.08.2008
Beiträge: 67

BeitragVerfasst am: Fr Aug 22, 2008 3:33 pm    Titel: Antworten mit Zitat

Hallo BoBo²,
meine Kenntnisse langen in keinster Form aus, um es als generell anwendbares Script einzustellen!!! Auch stehe ich bei Toralfs DLLCall draußen vor der Tür!

Hab mit dem Script mal Access 2003 angetestet. Hier scheint es immer so zu sein, dass die 17te Control_ID vom aktiven Child ist! Habs mal auf die Schnelle mit einem Formular und einem Tabellenfenster getestet.
Code:
#Persistent
#WinActivateForce
#NoEnv
settitlematchmode 1

WindowControlTextSize = 32767  ; Must be 32767 or less or it won't work on Windows 95.
VarSetCapacity(WindowControlText, WindowControlTextSize)

WinWait , Microsoft Access   ;warten bis aktiv
SetTimer, MDI_Client, 200
return

MDI_Client:
WinGet , ListOfControlHandles, ControlListHwnd, Microsoft Access
Loop , Parse, ListOfControlHandles, `n
{
   DllCall("GetWindowText", "uint", A_LoopField, "str", WindowControlText, "int", WindowControlTextSize)
   if (a_index = 17)
   {
      tooltip , aktiver Access-Child ist: %WindowControlText%
      return
   }
}
return

Somit ein möglicher Ansatz, der aber mit Bastelarbeit verbunden ist. Ich hab für mich zumindest damit die Lösung gefunden.

@Alle
Also - falls das Ganze eine auch für Andere verwertbare Entdeckung sein sollte / könnte, dann müssten mal die Experten draufschauen. Evtl. gibt es ja irgendwelche festen Regeln, die sich mir derzeit leider nicht erschließen!

MEC
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
denick



Anmeldedatum: 15.09.2006
Beiträge: 1230
Wohnort: Berlin

BeitragVerfasst am: Sa Aug 23, 2008 7:16 am    Titel: Antworten mit Zitat

Moin,

ich habe mir Arrowdas mal angeschaut und mit Access durchgespielt:

Code:
#NoEnv
SetTitleMatchMode, 2

WM_MDIGETACTIVE := 0x229
MDIClientClassNN := "MDIClient1"

Loop{
   If !WinExist("Microsoft Access") {
      Sleep 500
      Continue
   }
   WinGetClass, Class
   If !WinActive("ahk_class " Class) {
      Sleep 500
      Continue
   }
   WinGetTitle, Title1, A
   SendMessage, 0x229, 0, 0, MDIClient1, Microsoft Access
   MDIActiveID := ErrorLevel
   WinGetTitle, Title2, ahk_Id %MDIActiveID%
   MsgBox, %Title1%  -  %Title2%
   Break
}

Probier doch mal Dein Glück! Wink
_________________
Hilfe zur Hilfe

(de)nick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
BoBo²
Gast





BeitragVerfasst am: Sa Aug 23, 2008 9:00 am    Titel: Antworten mit Zitat

Möglicherweise macht es Sinn ein generelles MDI-Handling-Beispiel für eine Brot&Butter-Anwendung wie SysEdit (verfügbar auf allen (?) Windows Betriebssystemen) zu erstellen.
Zugegeben ich bin ein Anhänger von 'learning-by-doing'. Damit wäre das Grundkonzept auch für Nicht-Besitzer der exotischen Anwendung 'MS-Access', nachvollziehbar. Wink

Anyway. Danke für Euren Einsatz. Cool
Nach oben
denick



Anmeldedatum: 15.09.2006
Beiträge: 1230
Wohnort: Berlin

BeitragVerfasst am: Sa Aug 23, 2008 10:08 am    Titel: Antworten mit Zitat

Moin BoBo²,

ein "generelles MDI-Handling-Beispiel" ist mir z.Zt. noch zu hoch. Aber hier ist etwas für 'learning-by-doing':

Code:
#NoEnv
SetTitleMatchMode, 2

WS_EX_MDICHILD := 0x40

Loop{
   If !WinActive("Systemkonfigurationseditor") {
      Sleep 500
      Continue
   }
   WinGet, CL, ControlListHwnd
   Loop, Parse, Cl, `n
   {
      WinGet, ES, ExStyle, ahk_id %A_LoopField%
      If (ES & 0x40) {
         WinGetTitle, Title, ahk_id %A_LoopField%
         MDI .= A_LoopField " : " Title "`n"
      }
   }
   MsgBox, MDI-Fenster:`n`n%MDI%
   Break
}


SysEdit muss beim Start des Skripts offen sein!
_________________
Hilfe zur Hilfe

(de)nick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MEC



Anmeldedatum: 01.08.2008
Beiträge: 67

BeitragVerfasst am: Sa Aug 23, 2008 11:20 am    Titel: Antworten mit Zitat

Hallo,
hatte es nur deshalb mit Access getestet weils auf meinem Rechner drauf ist und weil meine Anwendung - geht hier um digitale Steuerbausteine - noch wesentlich exotischer ist.

@denick
Dein letztes Script habe ich jetzt in meine Lösung eingebaut! Super - vielen DANK! Hat den charmanten Vorteil gegenüber meiner "Entdeckung", dass es
- ohne DLLCALL auskommt
- mir (bei Bedarf) auch alle geöffneten MDI-Childs in der Reihenfolge der Aktivierung anzeigt

Frage:
Code:
WS_EX_MDICHILD := 0x40

Wie bekommt man die Hex-Werte raus und was bedeutet der Wert 0x40?
Gibt es eine Aufstellung/Link mit einer kompletten Aufstellung?
In der Doku unter List of Windows Messages sind ja nur Teile aufgeführt. Dein Befehl fehlt dort auch.

MEC
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
BoBo²
Gast





BeitragVerfasst am: Sa Aug 23, 2008 1:57 pm    Titel: Antworten mit Zitat

Zitat:
Zitat:
WS_EX_MDICHILD := 0x40

Wie bekommt man die Hex-Werte raus und was bedeutet der Wert 0x40?
Zuwie. Wird in einer Anleitung von Rajat (verlinkt unter Post-/SendMessage) beschrieben. Zuwas. Na der Wert repräsentiert [WS_EX_MDICHILD], einen der Extended Window Styles. It's that simple! Laughing
Nach oben
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Ich brauche Hilfe! Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de