 |
AutoHotkey Community Wir helfen uns gegenseitig aus der Patsche
|
| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
MEC
Anmeldedatum: 01.08.2008 Beiträge: 67
|
Verfasst am: Di Aug 19, 2008 8:04 pm Titel: Steuerung von 20 Scripts, die auf das Window warten |
|
|
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 |
|
 |
BoBo² Gast
|
Verfasst am: Di Aug 19, 2008 8:17 pm Titel: |
|
|
| 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
|
Verfasst am: Di Aug 19, 2008 8:42 pm Titel: |
|
|
| 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 |
|
 |
BoBo² Gast
|
Verfasst am: Di Aug 19, 2008 9:04 pm Titel: |
|
|
| 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
|
Verfasst am: Di Aug 19, 2008 9:09 pm Titel: |
|
|
Hab gerade meinen eigenen Rat verfolgt, und dabei festgestellt das die von mir vorgeschlagenen Pages ja auf einer früheren Anfrage von dir basieren. ...  |
|
| Nach oben |
|
 |
denick
Anmeldedatum: 15.09.2006 Beiträge: 1230 Wohnort: Berlin
|
Verfasst am: Mi Aug 20, 2008 5:27 am Titel: |
|
|
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 |
|
 |
MEC
Anmeldedatum: 01.08.2008 Beiträge: 67
|
Verfasst am: Mi Aug 20, 2008 2:12 pm Titel: |
|
|
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 |
|
 |
MEC
Anmeldedatum: 01.08.2008 Beiträge: 67
|
Verfasst am: Mi Aug 20, 2008 4:56 pm Titel: |
|
|
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.
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.
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 |
|
 |
BoBo² Gast
|
Verfasst am: Mi Aug 20, 2008 6:59 pm Titel: |
|
|
Na dann, bitte schön aufbereiten und ab damit in die Sektion Scripte & Funktionen
* und Referenz auf Toralf nicht vergessen  |
|
| Nach oben |
|
 |
MEC
Anmeldedatum: 01.08.2008 Beiträge: 67
|
Verfasst am: Fr Aug 22, 2008 3:33 pm Titel: |
|
|
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 |
|
 |
denick
Anmeldedatum: 15.09.2006 Beiträge: 1230 Wohnort: Berlin
|
Verfasst am: Sa Aug 23, 2008 7:16 am Titel: |
|
|
Moin,
ich habe mir das 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!  _________________ Hilfe zur Hilfe
(de)nick |
|
| Nach oben |
|
 |
BoBo² Gast
|
Verfasst am: Sa Aug 23, 2008 9:00 am Titel: |
|
|
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.
Anyway. Danke für Euren Einsatz.  |
|
| Nach oben |
|
 |
denick
Anmeldedatum: 15.09.2006 Beiträge: 1230 Wohnort: Berlin
|
Verfasst am: Sa Aug 23, 2008 10:08 am Titel: |
|
|
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 |
|
 |
MEC
Anmeldedatum: 01.08.2008 Beiträge: 67
|
Verfasst am: Sa Aug 23, 2008 11:20 am Titel: |
|
|
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 |
|
 |
BoBo² Gast
|
Verfasst am: Sa Aug 23, 2008 1:57 pm Titel: |
|
|
| 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!  |
|
| Nach oben |
|
 |
|
|
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
|