Maus Doppelklick-Taste Hooken und alternative Maustaste ausgeben

  • Grüße euch!
    Da ich mit den WinAPI sachen nicht klar komme und eine solide Lösung für mein Problem haben möchte wende ich mich hier mal an die Profis
    Folgendes Problem:
    Ich habe eine Maus mit "Doppelklick-Taste", diese sendet "PrimaryDown - PrimaryUp - PrimaryDown - PrimaryUp" in einer Zeit kleiner 20ms
    Nun möchte ich diese Taste alternativ belegt haben um sie in einem MMO als zusätzliche Taste belegen zu können (ähnlich der Daumentasten)

    Ich bräuchte also ein Script welches alle Doppelklicks die schneller als 20ms sind hooked und stattdessen eine andere Maustaste (Zusatztaste) simuliert.
    Die Primary - also linke Maustaste - und normal durchgeführte Doppelklicks sollen natürlich ganz normal durchgehen

    Danke im Voraus
    Shadow667

    UNPLEASANT SPOILER

    You just lost the game!

    Einmal editiert, zuletzt von shadow667 (2. September 2013 um 20:29)

  • Das soll ja kein Bot etc. werden, sondern eine simulierte Zusatztaste die es ja auf diversen Mäusen von Haus aus gibt. Wenn sich die Taste mit einem Treiber umstellen ließe müsste man nicht darüber diskutieren.
    Gibt ja mittlerweile Mäuse mit 12 Daumentasten, welche frei belegbar sind, da stellt sich die Frage auch niemand

    UNPLEASANT SPOILER

    You just lost the game!

  • Die Umsetzung mit AutoIt ist definitiv möglich. Ich habe gerade ein Programm gebastelt, dass genau das macht was du verlangst.
    Es gibt jedoch einige Einschränkungen (die aber nichts mit AutoIt zu tun haben):

    • Jeder einzelne, normale Mausclick wird um mindestens 20 ms verzögert.
    • Wenn du es schaffen solltest, aufgrund übernatürlicher menschliche Fähigkeiten, innterhalb von 20 ms 2 einzelne Mausclicks auf die konventionelle Weise zu tätigen, wird das als Hotkey interpretiert.
    • Wenn dein Programm sich aufhängen sollte oder die Aktion, die du im Falle eines 20 ms Doppelclicks ausführen willst, zu viel Zeit in Anspruch nehmen sollte ist dein Mauszeiger in dieser Zeit funktionsunfähig. Nach einigen Sekunden löscht Windows jedoch den Hook und geht davon aus, dass dein Programm ein Problem hat.


    Das einzige Problem, dass ich speziell in AutoIt habe ist die unschöne Lösung die ich verwenden musste um die Mausclicks zu verzögern.
    Diese Probleme wirst du in ähnlicher Form immer haben, egal wie du das ganze anpackst. Aber es sollte wirklich schwer sein innerhalb von 20 ms zwei mal auf die linke Maustaste zu hauen...

    Dieses Programm verstößt in keinster Weise gegen die Forenregeln, deswegen möchte ich einen guten Willen zeigen und das ganze hier zur Verfügung stellen. Ich bin ja weiß Gott nicht der erste der hier mit Hooks arbeitet.

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <WinAPI.au3>

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

    ; -Author: name22 (http://www.autoit.de)

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

    Global Const $iDoubleclickTime = 25
    Global $hCallback, $hMod, $hHook, $iClickState = 0

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

    OnAutoItExitRegister("_Shutdown")
    HotKeySet("{ESC}", "_Exit")

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

    $hCallback = DllCallbackRegister("_LL_MouseProc", "long", "int;wparam;lparam")

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

    $hMod = _WinAPI_GetModuleHandle(0)
    $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hCallback), $hMod)

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

    While Sleep(1000)
    WEnd

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

    Func _LL_MouseProc($nCode, $wParam, $lParam)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)

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

    Switch $wParam
    Case $WM_LBUTTONDOWN
    Switch $iClickState
    Case 0
    AdlibRegister("_DelayMouseClick", $iDoubleclickTime)
    $iClickState = 1
    Return 1
    Case 1
    AdlibUnRegister("_DelayMouseClick")
    $iClickState = 0
    ConsoleWrite("Doubleclick!" & @CRLF)
    Return 1
    Case 2
    $iClickState = 0
    EndSwitch
    EndSwitch
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndFunc

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

    Func _DelayMouseClick()
    $iClickState = 2
    MouseClick("left")
    AdlibUnRegister("_DelayMouseClick")
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _Shutdown()
    Do
    Sleep(20)
    Until $iClickState = 0

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

    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hCallback)
    EndFunc

    [/autoit]