Mausbewegungsrichtung ändern

  • Tach

    Nur mal so aus Interesse: ist es möglich, das wenn man die Maus aufwärts bewegt, der Cursor beispielsweise nach links fährt?
    Ich versuche gerade ein paar ergonomieverbesserungen an meiner Maus vorzunehmen und hab leider den Sensor verdrehen müssen, damit s genug Platz gibt.

    Grüsse

    Bild1: Ich beim debuggen

  • In AutoIt dürfte das nur etwas unschön gehen. Du musst dann quasi die Maus beim Hochbewegen wieder nach unten bewegen und dann nach links. Das gibt warscheinlich ein ziemliches Geruckel. Manchmal lässt sich das aber im Treiberprogramm anpassen.

  • Das wird mit höchster Wahrscheinlichkeit nur über den Treiber gehen. Je nach Hersteller und Treiberversion findest du evtl. sogar etwas dazu im Internet. Aber wie Cheater Dieter gesagt hat, ist das mit AutoIt nur sehr bedingt realisierbar, da es nicht nur ständig ruckeln würde, sondern auch nicht funktioniert wenn kein Benutzer angemeldet ist etc...

  • Ich hab zwei Ansätze probiert.

    1: Normale Mausbewegungen blockieren und Cursor auf neue Position setzen.
    Das Problem ist, dass die Mausposition immer absolut ausgelesen wird und man dadurch an den Bildschirmrändern hängenbleibt, da esja keine negativen Koordinaten gibt.

    Spoiler anzeigen
    [autoit]

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

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

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

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

    Global $hMouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
    Global $hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hMouseProc), _WinAPI_GetModuleHandle(0))
    Global $tMousePos = DllStructCreate("int X; int Y;")
    DllCall("user32.dll", "bool", "GetCursorPos", "ptr", DllStructGetPtr($tMousePos))
    Global $iMouseX = DllStructGetData($tMousePos, "X")
    Global $iMouseY = DllStructGetData($tMousePos, "Y")
    OnAutoItExitRegister("_OnExit")

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

    While Sleep(10)
    WEnd

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

    Func _MouseProc($nCode, $wParam, $lParam)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam)

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

    Switch $wParam
    Case $WM_MOUSEMOVE
    Local $tStruct = DllStructCreate("int X;int Y;dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo", $lParam)
    If DllStructGetData($tStruct, "flags") = 0 Then
    $iMouseX += ($iMouseX - DllStructGetData($tStruct, 1))
    $iMouseY += ($iMouseY - DllStructGetData($tStruct, 2))
    DllCall("user32.dll", "bool", "SetCursorPos", "int", $iMouseX, "int", $iMouseY)
    Return 1
    EndIf
    EndSwitch

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

    Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam)
    EndFunc ;==>_MouseProc

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Func _OnExit()
    _WinAPI_UnhookWindowsHookEx($hMouseHook)
    DllCallbackFree($hMouseProc)
    EndFunc ;==>_OnExit

    [/autoit]


    2: direkte Mausbewegungen werden wieder geblockt, aber generierte Mausbewegungen zugelassen
    Relative Mausbewegungen lassen sich via WM_INPUT auslesen und verändert generieren
    Das Problem hier ist, dass man z.B. keine Fenster verschieben kann!
    Man müsste in WM_INPUT alle Mausfunktionen erkennen und generieren, dann geht das evtl.
    Weiters setzt WM_INPUT ein GUI voraus...

    Spoiler anzeigen
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)

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

    Global $hGui = GUICreate("Test")
    GUISetOnEvent(-3, "_Exit")
    GUIRegisterMsg(0x00FF, "WM_INPUT")
    GUISetState(@SW_SHOW, $hGui)

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

    Global $hMouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
    Global $hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hMouseProc), _WinAPI_GetModuleHandle(0))

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

    Global $tMouse = DllStructCreate("dword dwType; dword dwSize; hwnd hDevice; uint_ptr wParam; ushort usFlags; ushort usButtonFlags; ushort usButtonData; ulong ulRawButtons; long lLastX; long lLastY; ulong ulExtraInformation;")
    Global $pMouse = DllStructGetPtr($tMouse)
    Global $iMouse = DllStructGetSize($tMouse)
    Global $tHeader = DllStructCreate("dword dwType; dword dwSize; hwnd hDevice; uint_ptr wParam;")
    Global $iHeader = DllStructGetSize($tHeader)
    _RegisterRawInput()

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

    OnAutoItExitRegister("_OnExit")

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

    While Sleep(10)
    WEnd

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

    Func _MouseProc($nCode, $wParam, $lParam)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam)

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

    Switch $wParam
    Case $WM_MOUSEMOVE
    Local $tStruct = DllStructCreate("int X;int Y;dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo", $lParam)
    If DllStructGetData($tStruct, "flags") = 0 Then
    Return 1
    EndIf
    EndSwitch

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

    Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam)
    EndFunc ;==>_MouseProc

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

    Func WM_INPUT($hWnd, $Msg, $wParam, $lParam)
    Local $aResult = DllCall("user32.dll", "dword", "GetRawInputData", "hwnd", $lParam, "dword", 0x10000003, "ptr", $pMouse, "dword*", $iMouse, "uint", $iHeader)
    If Not @error Then
    If DllStructGetData($tMouse, "hDevice") <> 0 Then
    DllCall("user32.dll", "none", "mouse_event", "DWORD", 0x0001, "DWORD", -DllStructGetData($tMouse, "lLastX"), "DWORD", -DllStructGetData($tMouse, "lLastY"), "DWORD", 0, "ULONG_PTR", 0)
    EndIf
    EndIf
    Return 'GUI_RUNDEFMSG'
    EndFunc ;==>WM_INPUT

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

    Func _RegisterRawInput()
    Local $tStruct = DllStructCreate("ushort usUsagePage; ushort usUsage; dword dwFlags; hwnd hwndTarget;")
    DllStructSetData($tStruct, "usUsagePage", 0x01)
    DllStructSetData($tStruct, "usUsage", 0x02)
    DllStructSetData($tStruct, "dwFlags", 0)
    DllStructSetData($tStruct, "hwndTarget", $hGui)
    Local $aResult = DllCall("user32.dll", "int", "RegisterRawInputDevices", "ptr", DllStructGetPtr($tStruct), "dword", 1, "dword", DllStructGetSize($tStruct))
    If @error Then Return SetError(1, 2, False)
    Return $aResult[0]
    EndFunc ;==>_RegisterRawInput

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Func _OnExit()
    _WinAPI_UnhookWindowsHookEx($hMouseHook)
    DllCallbackFree($hMouseProc)
    EndFunc ;==>_OnExit

    [/autoit]


    Die zweite Variante würde ohne Probleme funktionieren, wenn Microsoft WM_INPUT vor WH_MOUSE_LL aufrufen würde!
    Das wurmt mich etwas, denn das hätte ich nämlich schon öfters benötigt!


    E

  • Nur mal so aus Interesse: ist es möglich, das wenn man die Maus aufwärts bewegt, der Cursor beispielsweise nach links fährt?
    Ich versuche gerade ein paar ergonomieverbesserungen an meiner Maus vorzunehmen und hab leider den Sensor verdrehen müssen, damit s genug Platz gibt.


    Ich vermute dahinter eher die Absicht ein Spassskript (um Lehrer/Bekannte zu erschrecken) zu erstellen als Ergonomieverbesserungen, daher Vote for Close,

    mfg autoBert

  • ICH MACHE KEINE SPASSPROGRAMME :cursing: ...ich erlaube mir diese Unterstellung mal gekonnt zu Ignorieren...wenn du's genau wissen willst habe ich an meiner Maus rumgebastelt, also das Gehäuse ein bisschen an die Handform angepasst...und nun leider wie gesagt aus Platzgründen (von dem es wegen den Gehäuseanpassungen leider nun relativ wenig hat). Bei Bedarf kann ich dir mal den Entwurf zeigen, den ich noch zuhause rumliegen habe, aber das würde ich gerne vermeiden bis alles ohne Probleme läuft.

    Edit: eukalyptus: Lösung 1 reicht mir eigentlich schon, de Richtungen stimmen noch nicht aber das und den anderen Bug krieg ich schon selbst hin. thx

    Bild1: Ich beim debuggen

    Einmal editiert, zuletzt von General Kaboom (17. Oktober 2011 um 11:07)

  • ICH MACHE KEINE SPASSPROGRAMME :cursing: ...ich erlaube mir diese Unterstellung mal gekonnt zu Ignorieren...wenn du's genau wissen willst habe ich an meiner Maus rumgebastelt, also das Gehäuse ein bisschen an die Handform angepasst...und nun leider wie gesagt aus Platzgründen (von dem es wegen den Gehäuseanpassungen leider nun relativ wenig hat). Bei Bedarf kann ich dir mal den Entwurf zeigen, den ich noch zuhause rumliegen habe, aber das würde ich gerne vermeiden bis alles ohne Probleme läuft.Edit: eukalyptus: Lösung 1 reicht mir eigentlich schon, de Richtungen stimmen noch nicht aber das und den anderen Bug krieg ich schon selbst hin. thx

    Das ist ja wohl die dümmste Erklärung die dir dazu einfallen kann. Warum soll für eine jetzt kleinere Maus auf dem Tisch nicht mehr genug Platz sein, damit du Softwaretechnisch die Bewegung nach oben auf links um setzen musst? Was machst du wenn du nach links willst, wäre ja jetzt nach unten nötig.
    Dein Versuch einer Erklärung bestärkt mich in meiner Annahme dass ess für ein Spassprogramm gedacht ist, deshalb:

    Vote for close

    • Offizieller Beitrag

    Ich denke, ich verschaffe mal etwas Klarheit,mit einem kleinen Bildchen.
    Ich kenne keine Maus, die tatsächlich ergonomisch ist. Ich hatte auch schon überlegt, die Maus mal in ein der Handform angepassten Gehäuse unterzubringen. Dadurch kippt aber die X/Y-Achse.
    Links im Bild die standardmäßige, nicht der Handform angepaßte Mausführung - rechts, wie es eigentlich sinnvoll wäre.

    autoit.de/wcf/attachment/14396/

    Das hat absolut nichts mit Spaßprogramm zu tun, sondern ist ein Problem für alle, die keine Klein-Mädchen-Hände haben. ;)

  • BugFix Das soll jetzt nicht beleidigend sein, aber hast du verkrüppelte Hände wenn die so abgewinkelt zum Unterarm sind?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • ^^ naja, ich sag nicht das es normal ist aber für mich ist es so ähnlich einfach bequemer...habe das Gehäuse auch schon ausprobiert und bissher seeehr angenehm. Bug Fix hat mit seiner Abbildung also ziemlich ins schwarze getroffen...und keine Angst autoBert. Sobald ich eukalyptus Code an mein Maus angepasst habe, schliesse ich denn Thread, aber vorläufig lass ich ihn noch offen, falls ich noch ein Problem damit bekomme.

    Bild1: Ich beim debuggen

    • Offizieller Beitrag

    BugFix Das soll jetzt nicht beleidigend sein, aber hast du verkrüppelte Hände wenn die so abgewinkelt zum Unterarm sind?


    Nein - aber große Hände - und die Maus paßt ergonomisch halt in die Handfläche am Besten diagonal. Sollte das bei dir nicht der Fall sein, wäre es interessant zu wissen, ob deine Anatomie von der menschlichen abweicht (Position Mittelhandknochen).