Page 1 of 2

Sleep-Befehle ersetzen

Posted: 26 Jul 2019, 07:43
by WPLPHSS
Ich habe folgendes Problem nach Zulegung eines neuen Notebooks mit dem neuesten M-Prozessor (Intel® Core™ i5-8250U Prozessor Quad-Core 1,60 GHz ). Ist das Notebook nicht an der Steckdose, arbeitet er energiesparsam, so dass sich die Leistung verlangsamt und Makros nicht richtig ausgeführt werden.

Gibt es eine Möglichkeit, dass die Send-Befehle nach der Ausführung des vorherigen Send-Befehls auch ohne die Sleepbefehl relativ zügig im Bateriebetrieb ausgeführt werden?

Beispiel aus einem Makro mit einer langen Sleepdauer.
Send, {ALT down}f
Sleep, 200
Send {Alt up}
Sleep, 1000
Send, {f10}
Sleep, 2000
Send, {Control down}
Sleep, 200
Send, +
Sleep, 200
Send, {Control up}
Sleep, 200
Return

Re: Sleep-Befehle ersetzen

Posted: 26 Jul 2019, 10:51
by just me
Moin,

in Deinem Beipiel kann ich nichts erkennen, was wirklich langsamer laufen sollte. Das Skript befindet sich ja fast ausschließlich im Sleep-Modus, und der wird durch die Prozessorgeschwindigkeit kaum beeinflusst. 200 Millisekunden sind auch bei abgesenktem Prozessortakt eine 'Ewigkeit'. Die Anwendung, die das Ziel der Send-Anweisungen ist, könnte allerdings wirklich 'gebremst' laufen.

Re: Sleep-Befehle ersetzen

Posted: 26 Jul 2019, 11:11
by WPLPHSS
Kann man das Skript nicht so einstellen, dass unabhängig von der Taktung des Prozessors die Befehle (ohne Sleep) nacheinander abgearbeitet werden? Gibt es hierfür einen Befehl, den ich anstelle von Sleep in das Makro ersetzen könnte?

Re: Sleep-Befehle ersetzen

Posted: 26 Jul 2019, 11:20
by LuckyJoe
Hi,

schau dir doch mal die Hilfe zu SetBatchLines und / oder zu SetKeyDelay an.

HG - Lucky Joe

Re: Sleep-Befehle ersetzen

Posted: 27 Jul 2019, 02:33
by WPLPHSS
Guten Morgen!

Bringt leider nicht den gewünschten Erfolg. Die Skript soll einfach nur nach der Reihenfolge der Befehle abgearbeitet werden.

Re: Sleep-Befehle ersetzen

Posted: 27 Jul 2019, 03:03
by just me
Moin,

ich verstehe das nicht. Wenn Du keine Sleep Anweisungen haben willst, lösche sie. Normalerweise braucht man sie nach Send nur dann, wenn das Zielprogramm längere Zeit braucht, um die empfangenen Daten zu verarbeiten.

Re: Sleep-Befehle ersetzen

Posted: 27 Jul 2019, 03:11
by divanebaba
Hier eine mögliche prinzipielle Vorgehensweise, die ich aus Mangel an Kenntnissen nicht komplett ausgearbeitet habe.
Folgendes Prinzip: Feststellen, ob Akkubetrieb oder nicht und dementsprechend einen Faktor festlegen.

Code: Select all

; [Pseudocode] if "An der Steckdose"
x = 1
else
x = 2
...
sleep % 200*x
...
Jetzt musst Du nur noch herausfinden, ob man den Energieversorgungsstatus einfach abfragen kann.

Re: Sleep-Befehle ersetzen

Posted: 27 Jul 2019, 03:23
by WPLPHSS
Die Sleep-Befehle hatte ich gelöscht.

Send, {ALT down}
Send, f
Send, o
Send, o
Send, {Alt up}
Return

Alt f startet einen Assistenten als Fenster im Programm. Der Startvorgang dauert ca. 3 Sekunden. Jedoch werden vom o. g. Skript nicht Alt o und Alt o verarbeitet.

Re: Sleep-Befehle ersetzen

Posted: 27 Jul 2019, 04:07
by just me
Wenn der 'Assistent' als eigenes Fenster startet und dieses Fenster dann Alt+o verarbeiten soll, musst Du darauf warten, dass dieses Fenster aktiviert ist, bevor Du weitermachst.

Wenn Du für das Fenster eindeutige Kriterien ermitteln kannst, reicht dafür ein WinWaitActive

Re: Sleep-Befehle ersetzen

Posted: 27 Jul 2019, 06:42
by WPLPHSS
Aber das Fenster hat keine eindeutigen Kreiterien. Pech gehabt. Ich habe den Programmhersteller daher angeschrieben, Fenstertitel und -klassen zu definieren.

Vielen Dank für eure Beiträge.

Re: Sleep-Befehle ersetzen

Posted: 28 Jul 2019, 00:53
by LuckyJoe
Hast du das mal mit Window Spy überprüft?
Um welches Programm handelt es sich denn eigentlich?

Re: Sleep-Befehle ersetzen

Posted: 28 Jul 2019, 01:12
by Rohwedder
Hallo,
einfach darauf warten, daß ein anderes Fenster aktiv wird.

Code: Select all

HWND := WinActive("A")
Send, {ALT down}f
Sleep, 200
Send {Alt up}
WinWaitNotActive, ahk_id %HWND%
Send, {f10}

Re: Sleep-Befehle ersetzen

Posted: 30 Jul 2019, 00:47
by WPLPHSS
Guten Morgen!

Ich bin das Skript noch am testen. Aber es läuft besser als die vorherigen. Ich werde mich wieder melden. Vielen Dank.

Re: Sleep-Befehle ersetzen

Posted: 09 Aug 2019, 07:05
by WPLPHSS
Ich habe es jetzt ausgiebig mit Sfirm 4.0 (Bankingprogramm) getestet. Es funktioniert leider nicht.

::-sf::
Run, C:\Program Files (x86)\SFirmV4\SFirm.exe
HWND := WinActive("SFirm Anmeldung")
Sleep, 200
WinWaitNotActive, ahk_id %HWND%
Sleep, 200
Send, 123456
Return

Re: Sleep-Befehle ersetzen

Posted: 09 Aug 2019, 07:24
by just me
Moin,
wenn das nicht funktioniert, wäre für mich die erste Maßnahme:

Code: Select all

::-sf::
Run, C:\Program Files (x86)\SFirmV4\SFirm.exe
HWND := WinActive("SFirm Anmeldung")
MsgBox, HWND = %HWND%
...

Re: Sleep-Befehle ersetzen

Posted: 09 Aug 2019, 07:45
by WPLPHSS
Vielen Dank. Ich bin einen Schritt weiter.

Nach der Ausführung erscheint die Meldung in der MSgBox: HWND = 0x0.

Wie bekomme ich die Meldung im Vordergrund, dass das Makro weiterarbeiten kann?

Re: Sleep-Befehle ersetzen

Posted: 09 Aug 2019, 08:05
by just me
Wenn der Fenstertitel in WinActive("SFirm Anmeldung") korrekt ist, solltest Du Dir mal WinWaitActive anschauen.

Re: Sleep-Befehle ersetzen

Posted: 09 Aug 2019, 08:10
by LuckyJoe
... insbesondere, weil du in deinem Script auf
WinWaitNotActive, ahk_id %HWND%
prüfst ;-)

Re: Sleep-Befehle ersetzen

Posted: 09 Aug 2019, 09:45
by WPLPHSS
Nach 10 Sekunden kommt die MSgBox. Sie wird jedoch durch die SFirm Anmeldung überlagert. Wenn ich die Skundenzahl nach oben ändere, wird der Text 12345 nicht in das PW-Feld geschrieben.

::-sf::
Run, C:\Program Files (x86)\SFirmV4\SFirm.exe
HWND := WinActive("SFirm Anmeldung")
WinWaitActive, ahk_class #32770, ,10
MsgBox, HWND = %HWND%
Sleep, 200
Send, 123456
Return

Re: Sleep-Befehle ersetzen

Posted: 10 Aug 2019, 03:44
by just me
Moin,

wenn die MsgBox nach wie vor HWND = 0x0 ausgibt, bedeutet das, dass WinActive("SFirm Anmeldung") kein passendes aktives Fenster gefunden hat. Das kann daran liegen, dass der gesuchte Titel falsch ist oder dass er zwar richtig ist, das Fenster aber zu diesem Zeitpunkt noch nicht existiert bzw. noch nicht aktiv ist (siehe auch SetTitleMatchMode und Fenstertitel-Parameter).

Wenn die MsgBox nach 10 Sekunden erscheint, bedeutet das höchstwahrscheinlich, dass die 10 Sekunden Wartezeit von WinWaitActive abgelaufen sind, d.h. kein Fenster gefunden wurde. Man kann das einfach überprüfen. Bei Zeitablauf wird die interne Variable ErrorLevel auf 1 gesetzt (-> WinWaitActice).

Um zu prüfen, ob Dein Fenstertitel korrekt ist, kannst Du Folgendes probieren:

Code: Select all

::-sf::
Run, C:\Program Files (x86)\SFirmV4\SFirm.exe
Start := A_TickCount
WinWaitActive, SFirm Anmeldung, , 10
If (ErrorLevel)
	MsgBox, Das Fenster 'SFirm Anmeldung' wurde nicht innerhalb von 10 Sekunden aktiviert.
Else
	MsgBox, % "Das Fenster 'SFirm Anmeldung' wurde nach " . Round( (A_TickCount - Start) / 1000, 3)  . " Sekunden aktiviert."
Return