Unterschiedliche Mauszeiger an verschiedene Koordinaten?

  • Hi,
    Ich habe ein kleines Projekt am Laufen (post-ABITUR-Zeit, sprich mir ist langweilig).
    Dabei möchte ich (Anfänger im Programmieren) ein Script erstellen, welches mir erlaubt, mehrere Mauszeiger an verschiedene Koordinaten zu senden.
    So weit habe ich es schon geschafft:


    HotKeySet("{PAUSE}", "SetCursorPos")
    Const $X = 920
    Const $Y = 300
    Func SetCursorPos($int_X, $int_Y)
    DllCall('user32.dll', 'none', _
    'SetCursorPos', _
    'int', $int_X, _
    'int', $int_Y)

    EndFunc
    SetCursorPos($X, $Y)


    Das Problem ist nun eben, dass ich nicht weiß, wie ich Autoit erklären kann, dass ich n+1 Mäuse angeschlossen habe....
    Sollte es mit Autoit nicht funktionieren, könntet ihr mir bitte eine Programmierspr. nennen, die das kann???

    Dankeschön schon mal an alle, die mir bei diesem Problem helfen können!!!

  • darf ich Deine Frage neu formulieren so wie ich sie verstanden habe, da ich mit Deiner Frage nicht viel anfangen kann.

    Du möchtest an mehreren Stellen nacheinander automatisiert die Maus etwas anklicken lassen?

    Richtig?

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Also erstmal danke für die Antwort,
    so wie du die Frage umgestellt hat, will ich es (glaub ich) nicht^^...
    Ich weiß halt nicht genau, ob es überhaupt realisierbar ist, mein Ziel ist es, dass sozusagen zwei Mauszeiger von zwei Mäusen an zwei unterschiedlichen Koordinaten stehen, und ich beide dort frei bewegen kann

  • okay,
    also erstmal grundsätzlich: in Windows gibt es IMMER nur eine Maus.

    Ich denke damit ist der Thread beantwortet :D

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Es gibt doch Programme (Auch OS's wie Windows), die mit zwei Mäusen umgehen können?!
    Hab schon ne Weile gegoogelt....
    ich weiß halt nicht wie man die einzeln mit autoit aufruft..., aber wenn du meinst, dass es nicht geht... ich schätze du hast da mehr Ahnung als ich...*seufz*

  • bitte unterscheide zwischen den Eingabegeräten: "Maus" und dem Mauszeiger auf dem Bildschirm.

    Mäuse kannst Du an den PC anschließen soviele Du willst.
    Steuern werden aber alle immer nur den einen Mauszeiger ;)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Kannst du mir dann erklären, wie man das bei deinem ersten Beitrag ("Du möchtest an mehreren Stellen nacheinander automatisiert die Maus etwas anklicken lassen?") macht???


    Danke

  • Ich brauche auch 2 Mäuse für ein Script ^^

    Wenn man mehrere Mäuse (z.B.: Touchpad und USB-Maus) angeschlossen hat, dann kann man diese getrennt auslesen.
    Die Mauszeiger muss man allerdings selber zeichnen, und den richtigen Mauscursor immer auf die "aktuelle" Position setzen

    Soweit bin ich momentan:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>

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

    Opt("MouseCoordMode", 2)
    Opt("GUIOnEventMode", 1)

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

    Global $iWidth = @DesktopWidth / 2
    Global $iHeight = @DesktopHeight / 2

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

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

    [/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)

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

    Global $aMice = _GetMice()
    _RegisterMice()
    Global $aPos[$aMice[0] + 1][5]
    For $i = 2 To $aMice[0]
    $aPos[$i][0] = MouseGetPos(0)
    $aPos[$i][1] = MouseGetPos(1)
    Next

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

    OnAutoItExitRegister("_OnExit")
    ;_WinAPI_ShowCursor(False)

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

    While 1
    Sleep(100)
    WEnd

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

    Func _DrawMice()
    Local $hDC = _WinAPI_GetDC($hGui)

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

    Local $hBrush = _WinAPI_CreateSolidBrush(0x000000)
    Local $tRect = _WinAPI_GetClientRect($hGui)
    _WinAPI_FillRect($hDC, DllStructGetPtr($tRect), $hBrush)
    _WinAPI_DeleteObject($hBrush)
    For $i = 2 To $aMice[0]
    _WinAPI_DrawIcon($hDC, $aPos[$i][0] - $aPos[$i][3], $aPos[$i][1] - $aPos[$i][4], $aPos[$i][2])
    Next

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

    _WinAPI_ReleaseDC($hGui, $hDC)
    EndFunc ;==>_DrawMice

    [/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
    Local $hDevice = DllStructGetData($tMouse, "hDevice")
    Local $iX = DllStructGetData($tMouse, "lLastX")
    Local $iY = DllStructGetData($tMouse, "lLastY")
    Local $tCursor = DllStructCreate("DWORD cbSize; DWORD flags; hwnd hCursor; Long X; Long Y;")
    DllStructSetData($tCursor, 1, DllStructGetSize($tCursor))
    Local $aInfo
    For $i = 2 To $aMice[0]
    If $aMice[$i] = $hDevice Then
    $aPos[$i][0] += $iX
    $aPos[$i][1] += $iY
    MouseMove($aPos[$i][0], $aPos[$i][1], 0)
    $aInfo = _WinAPI_GetCursorInfo()
    $aPos[$i][2] = $aInfo[2]
    $aInfo = _WinAPI_GetIconInfo($aPos[$i][2])
    $aPos[$i][3] = $aInfo[2]
    $aPos[$i][4] = $aInfo[3]
    _DrawMice()
    ExitLoop
    EndIf
    Next
    EndIf
    Return 'GUI_RUNDEFMSG'
    EndFunc ;==>WM_INPUT

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

    Func _RegisterMice()
    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 ;==>_RegisterMice

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

    Func _GetMice()
    Local $aMice[1] = [0]
    Local $tStruct = DllStructCreate("hwnd hDevice; dword dwType;")
    Local $aResult = DllCall("user32.dll", "dword", "GetRawInputDeviceList", "ptr", 0, "dword*", 0, "dword", DllStructGetSize($tStruct))
    If @error Then Return SetError(1, 1, $aMice)
    If Not $aResult[2] Then Return SetError(1, 2, $aMice)
    Local $iCnt = $aResult[2]

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

    Local $sInfo = ""
    For $i = 1 To $iCnt
    $sInfo &= StringRegExpReplace("hwnd hDevice; dword dwType; ", "(\w+);", "${1}" & $i & ";")
    Next

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

    Local $tInfo = DllStructCreate($sInfo)
    $aResult = DllCall("user32.dll", "dword", "GetRawInputDeviceList", "ptr", DllStructGetPtr($tInfo), "dword*", $iCnt, "dword", DllStructGetSize($tStruct))
    If @error Then Return SetError(1, 3, $aMice)

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

    Local $iStep = 0
    For $i = 1 To $iCnt
    If DllStructGetData($tInfo, 'dwType' & $i) = 0 Then
    $iStep += 1
    ReDim $aMice[$iStep + 1]
    $aMice[$iStep] = DllStructGetData($tInfo, 'hDevice' & $i)
    EndIf
    Next
    $aMice[0] = $iStep
    Return $aMice
    EndFunc ;==>_GetMice

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Func _OnExit()
    _WinAPI_ShowCursor(True)
    EndFunc ;==>_OnExit

    [/autoit]

    Es funktioniert allerdings nur innerhalb des eigenen Fensters.
    Aber für meine Zwecke reicht das vollkommen, darüberhinaus benötige ich auch nur einen Mauszeiger...

    Evtl. wäre es möglich ein transparentes Fenster OnTop zu verwenden, mit UpdateLayeredWindow die Mauszeiger zu zeichnen und so mehrere Mäuse auch für fremde Anwendugen zu benutzen...
    Dazu müsste man jedoch gewährleisten, daß man auch die WM_INPUT messages bekommt, wenn ein anderes Fenster aktiv ist! - Und das ist mir momentan etwas zu kompliziert :D

    E

    Ach ja: Danke für die Starthilfe an den Autor von RawInput.au3 aus dem englischen Forum (Authenticity?!)