Shift "klemmt"

  • Hallo,
    ich hab schon Google, die offizielle Bugseite und die Forensuche bemüht, aber nichts passendes gefunden.
    Ich hab ein kleines Skript geschrieben, dass je nach Einstellung einen Text senden soll. Dazu wird ein Hotkey bestimmt (im Moment nur A) der dann zusammen mit Shift und Strg den Hotkey darstellt. Allerdings blockiert die Shifttaste gelegentlich und spielt Caps-Lock, teilweise ist auch Strg noch aktiv. Ich finde den Grund aber nicht. Auch eine Umstellung von kombinierter _isPressed()-Abfrage auf Hotkeyset brachte keine Änderung. Irgendwas verschluckt anscheinend den Button-Up. Nur wenn man den definierten Hotkey als erstes loslässt, klappt es (bis jetzt immer) ohne Zicken.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #Include <Misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $ES_READONLY = 0x0800
    $wname = "DotA Gamesettings"
    $hkeyval = "NONE"
    $hkey = ""
    opt("SendKeyDelay", -1)
    opt("SendKeyDownDelay", 0)
    Opt("SendAttachMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate($wname, 200, 100)

    [/autoit] [autoit][/autoit] [autoit]

    $checkdi = GUICtrlCreateCheckbox ("-di", -1, 0)
    $checkwaterred = GUICtrlCreateCheckbox ("-water red", -1, 20)
    $checkhhn = GUICtrlCreateCheckbox ("-hhn", -1, 40)
    $hklabel = GUICtrlCreateLabel ( "Hotkey: STRG + SHIFT + ", -1, 63 )
    $hotkey = GUICtrlCreateInput ( $hkeyval, 125, 63, 55,15, $ES_READONLY)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1

    $msg = GUIGetMsg()

    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect

    [/autoit] [autoit][/autoit] [autoit]


    if (ControlGetFocus($wname) = "Edit1") Then
    if _IsPressed("41") Then
    $hkey = "41"
    $hkeyval = "A"
    GUICtrlSetData ($hotkey, $hkeyval)
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    if ($hkey <> "") Then
    if (_IsPressed("10") And _IsPressed("11") And _IsPressed($hkey)) Then

    While (_IsPressed("10") And _IsPressed("11") And _IsPressed($hkey))
    Sleep(100)
    WEnd

    if (GUICtrlRead($checkdi) < 4) Then
    Send("{ENTER}-di{ENTER}")
    EndIf
    if (GUICtrlRead($checkwaterred) < 4) Then
    Send("{ENTER}-water red{ENTER}")
    EndIf
    if (GUICtrlRead($checkhhn) < 4) Then
    Send("{ENTER}-hhn{ENTER}")
    EndIf
    Send("^")
    Send("+")
    EndIf
    EndIf
    WEnd

    [/autoit]

    Dass das Skript erst nach loslassen der Tastenkombination ausgeführt wird ist übrigens kein Muss, war nur Teil eines Bugfix-Versuchs, ebenso wie Opt("SendAttachMode", 1) .

    Ich hoffe jemand kann mir dazu was sagen.

  • *lesen kann*

    $wname = "DotA Gamesettings"


    Ist ein kleines Programm um bei DotA schnell die Gamesettings einzustellen ohne den ganzen Krimskrams jedes mal neu tippen zu müssen, allerdings ist das für das Problem ja relativ egal vermute ich, daher hab ich das nicht extra erwähnt und steht ja auch im Code ;)

  • OK, Ja!
    Sry, hab den Q-Code nicht genauer angeschaut!

    MfG. tobi_girst

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »tobi_girst« (Morgen, 25:63)

  • hat keiner ne idee ? kann doch nicht sein, dass sowas noch nie aufgetreten ist ...

    • Offizieller Beitrag

    Hi,
    ich hab es dir mal kpl. umgestrickt. Für HotKeys sollte man schon die HotKey-Funktion benutzen. ;)
    Da alle HK mit STRG+SHIFT anfangen, habe ich die anderen Ziffern/Zahlen in einer Combo bereitgestellt.
    Wähle ein Radio, einen HK und mit dem Button Set wird der HK aktiviert.
    Der zugehörige Buchstabe wird daneben angezeigt.
    Mit Auswahl von "NO" und "Set" wird der HotKey deaktiviert.
    Wichtig: Die Bezeichnung der Radios muß identisch sein mit den Funktionen für das HotKey (das führende - stört nicht, wird abgeschnitten).

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $gui = GUICreate("DotA Gamesettings", 200, 100)
    Global $aRadio[3][3] = [ _
    [GUICtrlCreateRadio ("-di", 10, 10, 40),'',GUICtrlCreateLabel('', 90, 13, 20, 17)], _
    [GUICtrlCreateRadio ("-water_red", 10, 30, 70),'',GUICtrlCreateLabel('', 90, 33, 20, 17)], _
    [GUICtrlCreateRadio ("-hhn", 10, 50, 40),'',GUICtrlCreateLabel('', 90, 53, 20, 17)]]
    GUICtrlSetState($aRadio[0][0], $GUI_CHECKED)
    $hklabel = GUICtrlCreateLabel ( "Hotkey: STRG + SHIFT + ", 10, 73 )
    $coKey = GUICtrlCreateCombo('NO', 140, 70, 40, 20)
    $sItem = ''
    For $i = 48 To 90
    If $i = 58 Then $i = 65
    $sItem &= Chr($i) & '|'
    Next
    GUICtrlSetData($coKey, StringTrimRight($sItem, 1), 'NO')
    $btSet = GUICtrlCreateButton('Set', 140, 10, 40, 20)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btSet
    $hk = GUICtrlRead($coKey)
    For $i = 0 To UBound($aRadio) -1
    If BitAND(GUICtrlRead($aRadio[$i][0]), $GUI_CHECKED) Then
    If $hk <> 'NO'Then
    $aRadio[$i][1] = $hk
    HotKeySet("^+" & $hk, StringTrimLeft(ControlGetText($gui, '', $aRadio[$i][0]), 1))
    GUICtrlSetData($aRadio[$i][2], $hk)
    Else ; wenn "NO" gewählt wurde, wird der Hotkey zurückgesetzt (deaktiviert)
    HotKeySet("^+" & $aRadio[$i][1])
    GUICtrlSetData($aRadio[$i][2], '')
    EndIf
    ExitLoop
    EndIf
    Next
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func di()
    MsgBox(0, '', 'Func di')
    ;~ Send("{ENTER}-di{ENTER}")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func water_red()
    MsgBox(0, '', 'Func water_red')
    ;~ Send("{ENTER}-water red{ENTER}")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func hhn()
    MsgBox(0, '', 'Func hhn')
    ;~ Send("{ENTER}-hhn{ENTER}")
    EndFunc

    [/autoit]
  • hey, danke, ist auch ein interessanter ansatz ... aber so kann man nicht auf eine taste alle befehle legen, was die eigentliche idee war. meins funktionierte soweit auch richtig, problem war mehr das klemmen der shift-taste. das kann ich bei deiner version jetzt nicht auf anhieb testen, aber mal gucken ob es was ändert. wie gesagt, hotkeyset hat bei meinem problem nichts geholfen.

    • Offizieller Beitrag

    Aha, dann willst du also einen Hotkey bestimmen und unabhängig davon wählen ob Funktion 1 und/oder 2 und/oder 3 ausgeführt werden.
    Das klappt so:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $hotkey
    $gui = GUICreate("DotA Gamesettings", 200, 100)
    Global $aCheck[3] = [ _
    GUICtrlCreateCheckbox ("-di", 10, 10, 40), _
    GUICtrlCreateCheckbox ("-water_red", 10, 30, 70), _
    GUICtrlCreateCheckbox ("-hhn", 10, 50, 40)]
    $hklabel = GUICtrlCreateLabel ( "Hotkey: STRG + SHIFT + ", 10, 73 )
    $coKey = GUICtrlCreateCombo('NO', 140, 70, 40, 20)
    $sItem = ''
    For $i = 48 To 90
    If $i = 58 Then $i = 65
    $sItem &= Chr($i) & '|'
    Next
    GUICtrlSetData($coKey, StringTrimRight($sItem, 1), 'NO')
    $btSet = GUICtrlCreateButton('Set', 140, 10, 40, 20)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btSet
    $hk = GUICtrlRead($coKey)
    If $hk <> 'NO' Then
    $hotkey = $hk
    HotKeySet("^+" & $hotkey, 'currentHK')
    Else ; wenn "NO" gewählt wurde, wird der Hotkey zurückgesetzt (deaktiviert)
    HotKeySet("^+" & $hotkey)
    EndIf
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func currentHK()
    For $i = 0 To UBound($aCheck) -1
    If BitAND(GUICtrlRead($aCheck[$i]), $GUI_CHECKED) Then
    Call(StringTrimLeft(ControlGetText($gui, '', $aCheck[$i]), 1))
    EndIf
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func di()
    MsgBox(0, '', 'Func di')
    ;~ Send("{ENTER}-di{ENTER}")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func water_red()
    MsgBox(0, '', 'Func water_red')
    ;~ Send("{ENTER}-water red{ENTER}")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func hhn()
    MsgBox(0, '', 'Func hhn')
    ;~ Send("{ENTER}-hhn{ENTER}")
    EndFunc

    [/autoit]
  • Ja das ist es von der Art her schonmal, allerdings führt er den Befehl dann so lange aus, bis man die Taste loslässt. Ohne "while _isPressed sleep" bekommt man das wohl nicht weg, oder ? Ausserdem ist das eigentliche Ding auch dass ich mich frage, wieso es bei meiner Version zu "klemmendem" Shift kommt. Habe deine Version jetzt mit Send getestet und da passiert das gleiche, wenn man die Tastenkombi etwas gedrückt hält. Bei meinem Code kam es in kleineren Tests nicht mehr zu diesem Lock, wenn ich zwischen die einzelnen Funktionszeilen ein sleep(1) gesetzt habe. Warum das jetzt geholfen haben soll kann ich mir auch nicht erklären.

    Ausserdem frage ich mich wozu das user32.dll anhängen bei _isPressed gut sein soll, weiss das jemand ? Hab keine genaue Information dazu gefunden und es funktioniert ja auch so. Es stand nur irgendwo dass man das machen sollte wenn oft _isPressed abgefragt wird o.ä., aber nicht wieso.

    • Offizieller Beitrag

    dass man das machen sollte wenn oft _isPressed abgefragt wird o.ä., aber nicht wieso.

    Wenn du _IsPressed aufrufst wird per Voreinstellung die dll geöffnet, der Befehl ausgeführt und die dll geschlossen. Für eine bessere Performance empfiehlt sich bei häufigen Aufrufen:

    [autoit]

    $dll = DllOpen('deine-dll')
    _IsPressed('code', $dll)
    ;..
    _IsPressed('code', $dll)
    ;..
    ; usw.
    ; zum Programmende:
    DllClose($dll)

    [/autoit]