strg-Taste bleibt gedrückt
-
Tweaky -
30. Juli 2019 um 14:46 -
Erledigt
-
-
- Offizieller Beitrag
Ich sag mal ganz bösartig:
Weil Hotkeyset und Send einfach Scheißfunktionen sind.
Wenn ich Hotkey mit STRG verwenden muss, dann immer die kpl. Sequenz: {CTRLDOWN}q{CTRLUP}
Das löst i.A. das Problem.
-
Ab dann ist aber die strg-Taste noch gedrückt. Warum ist dies so ?
Dazu gibt es bereits einige Infos :
https://www.autoitscript.com/wiki/FAQ#Why_d…un_my_script.3F
https://www.autoitscript.com/forum/topic/13…olds-ctrl-down/
Wenn ich Hotkey mit STRG verwenden muss, dann immer die kpl. Sequenz: {CTRLDOWN}q{CTRLUP}
HotKeySet("{CTRLDOWN}q{CTRLUP}", ... ) (Strg+Q) bewirkt im Skript die Auskommentierung, also analog zu Num-Block und Minuszeichen.
Gruß Musashi
-
Die von Musashi verlinkte _SendEx -Funktion hilft hier ausgezeichnet.
-
Stimmt, aber so ganz verstehe ich die Funktion nicht.
Es ist ja nichts drin, wo die strg-Taste wieder losgelassen wird.
Warum wird dann die strg-Taste nicht losgelassen, wenn z. B. das Skript beendet wurde.
-
- Offizieller Beitrag
Stimmt, aber so ganz verstehe ich die Funktion nicht.
Es ist ja nichts drin, wo die strg-Taste wieder losgelassen wird.
Nein, aber die Funktion feuert Send erst ab, wenn die Tasten freigegeben sind. Ist das nach 1s noch nicht passiert kommt die Fehlermeldung.
-
Nein, aber die Funktion feuert Send erst ab, wenn die Tasten freigegeben sind. Ist das nach 1s noch nicht passiert kommt die Fehlermeldung.
So wirklich schön ist das Codebeispiel aus den von mir angegebenen Links nicht.
Spoiler anzeigen
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Misc.au3>
HotKeySet("^g", "google")
HotKeySet("^l", "linkedin")
HotKeySet("^f", "facebook")
HotKeySet("^h", "hyves")
While 1;loop forever
Sleep(100)
WEnd
Func Google()
_SendEx("username")
_SendEx("{TAB}")
_SendEx("password")
_SendEx("{TAB}")
_SendEx("{SPACE}")
EndFunc ;==>Google
Func linkedin()
_SendEx("username")
_SendEx("{TAB}")
_SendEx("password")
_SendEx("{TAB}")
_SendEx("{SPACE}")
EndFunc ;==>linkedin
Func facebook()
_SendEx("username")
_SendEx("{TAB}")
_SendEx("password")
_SendEx("{TAB}")
_SendEx("{SPACE}")
EndFunc ;==>facebook
Func hyves()
_SendEx("username")
_SendEx("{TAB}")
_SendEx("password")
_SendEx("{TAB}")
_SendEx("{SPACE}")
EndFunc ;==>hyves
Exit
Func _SendEx($ss, $warn = "")
Local $iT = TimerInit()
While _IsPressed("10") Or _IsPressed("11") Or _IsPressed("12")
If $warn <> "" And TimerDiff($iT) > 1000 Then
MsgBox(262144, "Warning", $warn)
EndIf
Sleep(50)
WEnd
Send($ss)
EndFunc;==>_SendExusername
Im Funktionsheader wird $warn als Default mit "" besetzt : Func _SendEx($ss, $warn = "")
Alle _SendEx-Aufrufe im Beispiel lassen diesen optionalen Parameter aber weg.
Daher wird if $warn <> "" And TimerDiff($iT) > 1000 Then ... nie True ==> die Fehlermeldung erscheint also nicht. Hält man STRG-G länger gedrückt, dann werden die Ausgaben gepuffert.
Gruß Musashi
-
- Offizieller Beitrag
Ich würde das völlig anders lösen. Nicht warten bis die Tasten released sind, sondern sie freigeben und Send() abschicken.
Python
Alles anzeigenFunc _SendSave($_s) Local Const $iBitMask = 0x8000 Local $hUser32 = DllOpen("user32.dll") If BitAnd(DllCall($hUser32, "short", "GetAsyncKeyState", "int", 0x10)[0], $iBitMask) <> 0 Then _keybd_event(0x10, 0x2, $hUser32) If BitAnd(DllCall($hUser32, "short", "GetAsyncKeyState", "int", 0x11)[0], $iBitMask) <> 0 Then _keybd_event(0x11, 0x2, $hUser32) If BitAnd(DllCall($hUser32, "short", "GetAsyncKeyState", "int", 0x12)[0], $iBitMask) <> 0 Then _keybd_event(0x12, 0x2, $hUser32) DllClose($hUser32) Send($_s) EndFunc Func _keybd_event($vkCode, $Flag=0, $_dll='user32.dll') DllCall($_dll, 'int', 'keybd_event', 'int', $vkCode, 'int', 0, 'int', $Flag, 'ptr', 0) EndFunc
-
Ich würde das völlig anders lösen. Nicht warten bis die Tasten released sind, sondern sie freigeben und Send() abschicken.
Das funktioniert besser !
Beispiel :
Python
Alles anzeigen#include <Misc.au3> HotKeySet("{ESCAPE}", "_Exit") ; --- Variante mit SHIFT G : --- ; HotKeySet("+g", "_Userdata") ; --- Variante mit CTRL (STRG) G : --- HotKeySet("^g", "_Userdata") While 1 ; ESC beendet Schleife Sleep(100) WEnd Exit ; ------------------------------------------------------------------------------------ ; Hotkey-Funktion _Userdata : Func _Userdata() _SendSave("Username") _SendSave("{TAB}") _SendSave("{SPACE}") _SendSave("Password") _SendSave("{SPACE}") ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : _Userdata' & @CRLF & '>Error code: ' & @error & @CRLF) EndFunc ;==>_Userdata ; ------------------------------------------------------------------------------------ ; Hotkey-Funktion _Exit : Func _Exit() ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : _Exit' & @CRLF & '>Error code: ' & @error & @CRLF) Exit EndFunc ;==>_Google ; ------------------------------------------------------------------------------------ Func _SendSave($_s) Local Const $iBitMask = 0x8000 Local $hUser32 = DllOpen("user32.dll") If BitAnd(DllCall($hUser32, "short", "GetAsyncKeyState", "int", 0x10)[0], $iBitMask) <> 0 Then _keybd_event(0x10, 0x2, $hUser32) If BitAnd(DllCall($hUser32, "short", "GetAsyncKeyState", "int", 0x11)[0], $iBitMask) <> 0 Then _keybd_event(0x11, 0x2, $hUser32) If BitAnd(DllCall($hUser32, "short", "GetAsyncKeyState", "int", 0x12)[0], $iBitMask) <> 0 Then _keybd_event(0x12, 0x2, $hUser32) DllClose($hUser32) Send($_s) EndFunc ; ------------------------------------------------------------------------------------ Func _keybd_event($vkCode, $Flag=0, $_dll='user32.dll') DllCall($_dll, 'int', 'keybd_event', 'int', $vkCode, 'int', 0, 'int', $Flag, 'ptr', 0) EndFunc
Gelegentlich wird {TAB} ignoriert. Da habe ich auf die Schnelle aber keine Systematik erkannt und das war bei dem alten Code auch bereits so.
Bei HotKeySet mit z.B. HotKeySet("{CTRLDOWN}g{CTRLUP}", "_Userdata") wird die Funktion _Userdata nicht durchlaufen.
Stattdessen werden im SciTE-Editor die Standard-Hotkeys ausgeführt, also z.B. :
g -> Goto-Fenster
q -> Auskommentierung
Ich sag mal ganz bösartig : Weil Hotkeyset und Send einfach Scheißfunktionen sind.
Nun ja, dem kann man wohl nicht völlig widersprechen.
Gruß Musashi
-
Danke dies ist natürlich perfekt
-
Gibt es eine Möglichkeit _SendSave auch an ein bestimmtes Fenster zu schicken (so wie ControlSend)?
-
auch an ein bestimmtes Fenster zu schicken
Probier mal, ob dich _SendMessage() weiter bringt.
-
ok danke