Invert Mouse input

  • Hi,


    wie der Titel schon sagt will ich den Maus input umkehren d. h.


    links_klick=rechts_klick

    rechts_klick=links_klick


    Mein ansatz:

    [autoit]

    DllCall("user32.dll", "int", "SwapMouseButton", "int", 1)

    [/autoit]


    Mein Problem:

    Das ganze soll auf einem Touchscreen funktionieren das Problem hierbei ist das wahrscheinlich der Treiber das i-wie umgeht.


    Meine Frage:


    Ist es möglich den Mausklick abzufangen befor er ausgeführt wird also wenn ich die linke maustaste drücke soll die garnicht erst ausgeführt werden.

    Es soll nur die Information abgefangen werden, dass die Taste gedrückt wurde.


    Falls es jemand einen anderen Lösungsvorschlag hätte währe auch nett. ;)


    MfG

    Griss

  • Läuft AutoIt auf Touchscreen-Geräten?

    Warum sollte es nicht? Auch Windows unterstützt Touchscreen Monitore, haben selbst einige Win7 Touchscreen Workstations bei uns in der Firma. ;)
    Für einen Administrator sind die Dinger allerdings mehr als nervig, gottseidank haben wir zusätzlich Tastatur und Maus an den Geräten...

    • Offizieller Beitrag

    Ist doch nur ein simpler Dll-Call:

    [autoit]


    _SwapMouseButton() ; == Wechsel Links zu Rechts
    ;_SwapMouseButton(0) ; == Zurücksetzen

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

    Func _SwapMouseButton($fSwap=True)
    DllCall("user32", "long", "SwapMouseButton", "long", $fSwap)
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Abfangen kannst du die Mausereignisse, ich hab das mal in mein Demoskript integriert. Hier werden jetzt linke und rechte Maustastenereignisse kpl. verworfen:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    OnAutoItExitRegister('OnAutoItExit')
    HotKeySet('^+q', '_Exit') ; Strg+Shift+Q

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

    Global Const $HC_ACTION = 0
    Global $hStub_MouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
    Global $hmod = _WinAPI_GetModuleHandle(0)
    Global $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod)

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

    While True
    Sleep(50)
    WEnd

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

    Func _MouseProc($nCode, $wParam, $lParam)
    Local $event, $info, $iX, $iY, $mouseData = "", $wheelData = "", $wheelCount
    $info = DllStructCreate("int X;int Y;dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo", $lParam)
    $iX = DllStructGetData($info, 1)
    $iY = DllStructGetData($info, 2)
    $mouseData = DllStructGetData($info, 3)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    If $nCode = $HC_ACTION Then
    Switch $wParam
    Case $WM_MOUSEMOVE
    $event = "Mouse Move"
    Case $WM_MOUSEWHEEL
    $event = "Mouse Wheel"
    If _WinAPI_HiWord($mouseData) > 0 Then
    $wheelData = " Forward"
    Else
    $wheelData = " Backward"
    EndIf
    $wheelCount = _WinAPI_HiWord($mouseData)/120
    Case $WM_LBUTTONDOWN
    $event = "Left Down"
    ConsoleWrite('No LeftDown' & @CRLF)
    Return -1 ; Return -1 verwirft die Nachricht
    Case $WM_LBUTTONUP
    $event = "Left Up"
    ConsoleWrite('No LeftUp' & @CRLF)
    Return -1
    Case $WM_RBUTTONDOWN
    $event = "Right Down"
    ConsoleWrite('No RightDown' & @CRLF)
    Return -1
    Case $WM_RBUTTONUP
    $event = "Right Up"
    ConsoleWrite('No RightUp' & @CRLF)
    Return -1
    Case $WM_MBUTTONDOWN
    $event = "Wheel Down"
    Case $WM_MBUTTONUP
    $event = "Wheel Up"
    EndSwitch
    EndIf
    ConsoleWrite($iX & ', ' & $iY & ' ' & $event & $wheelData & ' count: ' & $wheelCount & @CRLF)
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

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

    Func OnAutoItExit()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_MouseProc)
    EndFunc ;==>OnAutoItExit

    [/autoit]
  • Ich habs jetzt hinbekommen der einzigste fehler is nur das es laggy ist und nur funktioniert wenn ich die maus bewege o.O.
    Weiß aber nicht genau wiso...

    Mein code bis jetzt:


    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.8.1
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    OnAutoItExitRegister('OnAutoItExit')
    HotKeySet('^+q', '_Exit') ; Strg+Shift+Q

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

    Dim $invert=1, $event

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

    if $invert=0 Then
    $l_event="left"
    $r_event="right"
    ElseIf $invert=1 Then
    $l_event="right"
    $r_event="left"
    EndIf

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

    Global Const $HC_ACTION = 0
    Global $hStub_MouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
    Global $hmod = _WinAPI_GetModuleHandle(0)
    Global $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod)

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

    While True
    Sleep(50)
    WEnd

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

    Func _MouseProc($nCode, $wParam, $lParam)
    Local $info, $iX, $iY, $p_input=0
    $info = DllStructCreate("int X;int Y", $lParam)
    $iX = DllStructGetData($info, 1)
    $iY = DllStructGetData($info, 2)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    If $nCode = $HC_ACTION Then
    if $wParam=$WM_LBUTTONDOWN Then
    ConsoleWrite("Ldown"&@CRLF)
    $event=$l_event
    Return -1
    EndIf
    if $wParam=$WM_LBUTTONUP Then
    ConsoleWrite("Lup"&@CRLF)
    Return -1
    EndIf
    if $wParam=$WM_RBUTTONDOWN Then
    ConsoleWrite("Rdown"&@CRLF)
    $event=$r_event
    Return -1
    EndIf
    if $wParam=$WM_RBUTTONUP Then
    ConsoleWrite("Rup"&@CRLF)
    Return -1
    EndIf
    EndIf
    if $event <> "" Then
    _WinAPI_UnhookWindowsHookEx($hHook)
    MouseClick($event)
    $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod)
    $event=""
    EndIf
    ConsoleWrite($iX & ', ' & $iY & @CRLF)
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

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

    Func OnAutoItExit()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_MouseProc)
    EndFunc ;==>OnAutoItExit@

    [/autoit]

    MfG
    Griss

  • Mein script bis jetzt:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    OnAutoItExitRegister('OnAutoItExit')
    HotKeySet('^+q', '_Exit') ; Strg+Shift+Q

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

    Dim $invert=1, $event

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

    if $invert=0 Then ;abfrage ob maustaste umgekehrt werden soll oder nicht
    $l_event="left";event bei (l) linker maustaste
    $r_event="right";event bei (r) rechter maustaste
    ElseIf $invert=1 Then
    $l_event="right"
    $r_event="left"
    EndIf

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

    Global $hStub_MouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
    Global $hmod = _WinAPI_GetModuleHandle(0)
    Global $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod) ;windowshook setzten

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

    While True
    if $event <> "" Then ;abfrage ob die ein event eingetreten ist
    _WinAPI_UnhookWindowsHookEx($hHook) ; unhook damit der mausklick nicht abgefangen wird
    MouseClick($event) ; $event -> "right" oder "left"
    $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod) ;windowshook wieder setzten
    $event=""; zurücksetzten auf ""
    EndIf
    WEnd

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

    Func _MouseProc($nCode, $wParam, $lParam)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    Switch $wParam
    Case $WM_LBUTTONDOWN
    $event=$l_event; event für (l) links setzten
    Return -1
    Case $WM_LBUTTONUP
    Return -1
    Case $WM_RBUTTONDOWN
    $event=$r_event; event für (r) rechts setzten
    Return -1
    Case $WM_RBUTTONUP
    Return -1
    EndSwitch
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

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

    Func OnAutoItExit()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_MouseProc)
    EndFunc ;==>OnAutoItExit@

    [/autoit]

    Mein Problem ist das es am Tablet (Touchscreen) erst beim 2ten klick funktioniert. (Erst wenn die maus bewegt wurde.)
    Am Touchpad funktioniert es problem los.

    Das zweite Problem ist das die taste nicht gerückt bleibt wenn man drauf bleibt.
    Ich weiß aber nicht wie ich das umsetzten soll.

    MfG
    Griss

  • Probiers mal damit:

    [autoit]

    Example()

    Func Example()
    ; Swap the left button to generate right-button messages and vice versa.
    ConsoleWrite(_WinAPI_SwapMouseButton(True) & @CRLF)

    ; Wait for the user to see the changes.
    Sleep(10000)

    ; Change the mouse buttons back to their original meanings.
    ConsoleWrite(_WinAPI_SwapMouseButton(False) & @CRLF)
    EndFunc ;==>Example

    ; If $fFlag is True, the left button generates right-button messages and the right button generates left-button messages.
    ; If $fFlag is False, the buttons are restored to their original meanings.
    Func _WinAPI_SwapMouseButton($fFlag)
    Local $aReturn = DllCall('user32.dll', 'int', 'SwapMouseButton', 'int', $fFlag)
    If @error Then
    Return SetError(1, 0, 0)
    EndIf
    Return $aReturn[0]
    EndFunc ;==>_WinAPI_SwapMouseButton

    [/autoit]