Probleme mit _isPressed und HotkeySet

  • Hejo

    Ich würd gern diverse Sachen mit Hotkeys machen. Allerdings kann man per HotkeySet() den Funktionen keine Parameter überliefern, weswegen es sehr kompliziert und häßlich wär nachträglich alle Funktionen zu zerstückeln dafür.

    Einfacher wäre es mit _isPressed(). Blöderweise wird das aber nicht zuverlässig ausgeführt, wenn ich eine zugewiese Taste drücke wird die angewiesene Aktion gerne 2 oder 3 mal ausgeführt, im folgenden Beispiel werden so zb manchmal statt einem gleich 2 "x" an Notepad gesendet. Anscheinend ist das weil HotkeySet() die Windows-Toleranz für Tastendrücke verwendet, während _isPressed() in diesem Fall jeden Tastendruck der über 50ms liegt erneut ausführt. Kann man die Zeit global anpassen oder besser noch HotkeySet() irgendwie doch mit Parametern verwenden?

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>

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

    Opt("WinTitleMatchMode",2)
    Global $titel = "[TITLE:Editor;CLASS:Notepad]" ; Editor / notepad.exe
    Global $control = "[CLASS:Edit; INSTANCE:1]"
    HotKeySet("{F3}","hkF3")

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

    While 1
    Sleep(50)
    If WinActive($titel) And _IsPressed(71) Then ControlSend($titel,"",$control,"x") ; F2 Key sollte ein "x" senden
    WEnd

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

    Func hkF3()
    If WinActive($titel) Then ControlSend($titel,"",$control,"y") ; F3 Key sollte ein "y" senden
    EndFunc

    [/autoit]

    4 Mal editiert, zuletzt von klischee (9. Februar 2012 um 22:27)

    • Offizieller Beitrag

    Das lässt sich ganz einfach beheben:

    [autoit]


    #include <Misc.au3>

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

    Opt("WinTitleMatchMode",2)
    $titel = "[TITLE:Editor;CLASS:Notepad]" ; Editor / notepad.exe

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

    While 1
    Sleep(50)
    If WinActive($titel) And _IsPressed(71) Then
    ControlSend($titel,"","[CLASS:Edit; INSTANCE:1]","x") ; F2 Key sollte ein "x" senden
    Do
    Until Not _IsPressed(71)
    EndIf
    WEnd

    [/autoit]
  • Danke, ist ein guter Ansatz und für meinen Zweck auch ausreichend :)

    Aaaber.. grundsätzlich will man ja auch dass länger gedrückte Tasten erkannt werden. Zb wenn man Pfeiltasten verwendet. In diesem Fall dreht _isPressed() völlig durch, seh ich zb wenn ich damit Frames überspringe. HotkeySet() ist da voll akkurat, während isPressed regelrecht Amok läuft.

    Darum ... falls es bei HotkeySet() doch noch einen Trick mit Parametern gibt, würd ich mich drüber freuen ^^ Ansonsten verwend ich isPressed() momentan eh nur für ein paar Einzelfälle da ist das mit dem Do ne gute Lösung, danke nochmal.

    • Offizieller Beitrag

    Du kannst ja auch zusätzlich einen Timer verwenden:

    [autoit]


    #include <Misc.au3>

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

    Opt("WinTitleMatchMode",2)
    $titel = "[TITLE:Editor;CLASS:Notepad]" ; Editor / notepad.exe

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

    While 1
    Sleep(10)
    If WinActive($titel) And _IsPressed(71) Then
    ControlSend($titel,"","[CLASS:Edit; INSTANCE:1]","x") ; F2 Key sollte ein "x" senden
    $Timer = TimerInit()
    Do
    Until Not _IsPressed(71) Or TimerDiff($Timer) > 50
    EndIf
    WEnd

    [/autoit]