Script zum tastaturanschlagmessen verbessern

  • Hi! peethebee hat mir netterweise ein proggi erstellt, womit man die tastaturanschläge in etwa messen kann.
    Nur wollte ich das script für World of Warcraft verwenden, wo aber jede rmit den tasten W A S D läuft. Nun würde es mich freuen wenn mir jemand zeigen kann, wie ich diese Tasten ausnehmen kann von der Zählung, damit er nicht das laufen auch als tastaturanschlag zählt!

    es wäre nur W A S D

    Hier noch das Script ansich:

    Spoiler anzeigen

    ;Autor peethebee für Huggy

    Global $i = 0

    While 1
    Sleep(90)
    For $j = Dec("30") To Dec("5A")
    If _IsPressed(Hex($j, 2)) Then $i = $i + 1
    Next
    ToolTip($i)
    WEnd

    Func _IsPressed($s_hexKey, $v_dll = 'user32.dll')
    ; $hexKey must be the value of one of the keys.
    ; _Is_Key_Pressed will return 0 if the key is not pressed, 1 if it is.
    Local $a_R = DllCall($v_dll, "int", "GetAsyncKeyState", "int", '0x' & $s_hexKey)
    If Not @error And BitAND($a_R[0], 0x8000) = 0x8000 Then Return 1
    Return 0
    EndFunc ;==>_IsPressed

    Danke!

    • Offizieller Beitrag

    Global $i = 0

    While 1
    Sleep(90)
    For $j = Dec("30") To Dec("5A")
    If not $j = Dec(...) and not $j = Dec(...) usw. Then
    If _IsPressed(Hex($j, 2)) Then $i = $i + 1
    EndIf
    Next
    ToolTip($i)
    WEnd

    Func _IsPressed($s_hexKey, $v_dll = 'user32.dll')
    ; $hexKey must be the value of one of the keys.
    ; _Is_Key_Pressed will return 0 if the key is not pressed, 1 if it is.
    Local $a_R = DllCall($v_dll, "int", "GetAsyncKeyState", "int", '0x' & $s_hexKey)
    If Not @error And BitAND($a_R[0], 0x8000) = 0x8000 Then Return 1
    Return 0
    EndFunc ;==>_IsPressed

    Die Werte gibt es in der Hilfe.

    peethebee

  • Hi, versuche es mal so:

    Global $i = 0

    While 1
    Sleep(90)
    For $j = Dec("30") To Dec("5A")

    If $j = Dec("11") or $j = Dec("1e") or $j = Dec("1f") or $j = Dec("20")then
    ExitLoop
    elseIf _IsPressed(Hex($j, 2)) Then
    $i = $i + 1
    Endif


    Next
    ToolTip($i)
    WEnd

    Func _IsPressed($s_hexKey, $v_dll = 'user32.dll')
    ; $hexKey must be the value of one of the keys.
    ; _Is_Key_Pressed will return 0 if the key is not pressed, 1 if it is.
    Local $a_R = DllCall($v_dll, "int", "GetAsyncKeyState", "int", '0x' & $s_hexKey)
    If Not @error And BitAND($a_R[0], 0x8000) = 0x8000 Then Return 1
    Return 0
    EndFunc ;==>_IsPressed

  • Hilft alles nix=(, aber es kommt mir so vor, als wäre trallalas irgendwie,...genauer beim zählen? =)

  • Guten Morgen,

    ich habe mal ein bissl experimentiert - vlt. kommen wir der Lösung dieses Wochenende noch näher ...

    $keys = StringSplit( "42|43|45|46|47|48|49|4A|4B|4C|4D|4E|4F|50|51|52|54|55|56|58|59|5A|" & _ ; <--- a bis z, ausgeschlossen a,w,s,d
    "30|31|32|33|34|35|36|37|38|39|" & _ ; <-- 0 bis 9
    "60|61|62|63|64|65|66|67|68|69|6A|6B|6C|6D|6E|6F|" & _ ; <-- Ziffernblock
    "70|71|72|73|74|75|76|77|78|79|7A|7B", "|") ; <-- F1 bis F12
    ;
    Global $i = 0

    While 1
    Sleep(90)
    For $j = 1 To $keys[0]
    If _IsPressed($keys[$j]) Then $i = $i + 1
    Next
    ToolTip($i)
    WEnd

    Func _IsPressed($s_hexKey, $v_dll = 'user32.dll')
    ; $hexKey must be the value of one of the keys.
    ; _Is_Key_Pressed will return 0 if the key is not pressed, 1 if it is.
    Local $a_R = DllCall($v_dll, "int", "GetAsyncKeyState", "int", '0x' & $s_hexKey)
    If Not @error And BitAND($a_R[0], 0x8000) = 0x8000 Then Return 1
    Return 0
    EndFunc ;==>_IsPressed

    2 Mal editiert, zuletzt von trallala (2. September 2006 um 12:53)

  • Jo, danke! Funtzt super!

    Womit ich halt noch rum-experimentieren muss ist die scanzeit =)


    BIG THX!!!


    :klatschen: :klatschen: :klatschen: :klatschen: :klatschen: :klatschen: :klatschen: :klatschen: :klatschen: :klatschen: :klatschen: :klatschen: :klatschen: :klatschen: :klatschen: :klatschen: :klatschen: :klatschen:
    :party4: :party4: :party4: :party4: :party4: :party4: :party4: :party4:
    :party3: :party3: :party3: :party3: :party3: :party3: :party3: :party3:
    :tier: :tier: :tier: :tier: :tier: :tier: :tier: :tier: :tier: :tier: :tier: :tier:

    • Offizieller Beitrag

    Steht in der Hilfe - unter IsPressed ;)

    Das korrekte Zählen baue ich dir gleich ein.

    Edit:

    [autoit]

    $keys = StringSplit("42|43|45|46|47|48|49|4A|4B|4C|4D|4E|4F|50|51|52|54|55|56|58|59|5A|" & _ ; <--- a bis z, ausgeschlossen a,w,s,d
    "30|31|32|33|34|35|36|37|38|39|" & _ ; <-- 0 bis 9
    "60|61|62|63|64|65|66|67|68|69|6A|6B|6C|6D|6E|6F|" & _ ; <-- Ziffernblock
    "70|71|72|73|74|75|76|77|78|79|7A|7B", "|") ; <-- F1 bis F12
    ;
    Global $i = 0
    Global $last = 0

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

    While 1
    Sleep(100)
    For $j = 1 To $keys[0]
    If _IsPressed($keys[$j]) and $last <> $j Then
    $i = $i + 1
    $last = $j
    EndIf
    Next
    ToolTip($i)
    WEnd

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

    Func _IsPressed($s_hexKey, $v_dll = 'user32.dll')
    ; $hexKey must be the value of one of the keys.
    ; _Is_Key_Pressed will return 0 if the key is not pressed, 1 if it is.
    Local $a_R = DllCall($v_dll, "int", "GetAsyncKeyState", "int", '0x' & $s_hexKey)
    If Not @error And BitAND($a_R[0], 0x8000) = 0x8000 Then Return 1
    Return 0
    EndFunc ;==>_IsPressed

    [/autoit]

    Diese Variante zählt Tasten nur dann falsch, wenn zwei gleichzeitig gedrückt sind. Sonst wird ein Tastendruck auch als genau einer gezählt.

    Leider verursacht diese Variante bei mir (Athlon 64 X2 3800+) 2-3% Prozessorlast. Könnte sein, dass das (auch) an dem Ständig aktualisierten ToolTip liegt.
    Man könnte es also per HotKey an- und ausschaltbar machen.
    Außerdem sollte man beim Beenden der Wert (in einer Ini-Datei z.B.) konservieren und dann beim nächsten Start weider auslesen.

    Wer Lust hat, kann ja mal den Kreuzvergleich gegen die HotKeySet-Variante fahren. Die etwas aufwendliger zu programmieren, aber die Prozessorlast sollte niedriger liegen, da Windows sich meldet, wenn ein HotKey gedrückt wurde.


    peethebee