MouseHook: Mauszeiger dauerhaft ersetzen.

  • Hi AutoIt Forum,

    folgende Problematik:

    Ich habe das Problem, dass wenn ich in mein Zeichenprogramm gehe, der Mauszeiger Automatisch beim betreten der Malfläche, sich in ein schwarzes Kreuz ändert. Ich
    benötige für meine Zwecke allerdings einen Roten Punkt als Cursor. Den Cursor in der benutzen Mal Software zuändern, habe ich bereits probiert, bin aber daran gescheitert, dass die Software nur Schwarz Weiß Cursor supportet. Friesel, sowie sehr Tatkräftig hat mir BugFix geholfen. Gesucht wird ein Script, welches wie gesagt, den Mauszeiger in einen Roten Punkt verwandelt. Folgendes Script habe ich netterweise von BugFix erhalten:

    Spoiler anzeigen
    [autoit]

    #include
    #include
    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]

    Global $hRef = 'Handle_des_Referenzfensters_auf_dem_der_Cursor_wirksam_sein_soll'
    ;~ Global $hRef = WinGetHandle('[ACTIVE]')

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

    Global $hCursor = GUICreate('', 48, 48, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)
    WinSetTrans($hCursor, '', 10)
    GUISetCursor(3, 1, $hCursor)
    Global $fCursor = False

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

    While True
    Sleep(50)
    WEnd

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

    Func _MouseProc($nCode, $wParam, $lParam)
    Local $info, $iX, $iY
    $info = DllStructCreate("int X;int Y;dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo", $lParam)
    $iX = DllStructGetData($info, 1)
    $iY = DllStructGetData($info, 2)
    Local $aRef = WinGetPos($hRef)
    If ($nCode < 0 Or WinGetHandle('[ACTIVE]') <> $hRef) Or Not _
    ( ($iX >= $aRef[0] And $iX <= $aRef[0] +$aRef[2]) And _
    ($iY >= $aRef[1] And $iY <= $aRef[3]) ) Then
    If $fCursor Then
    $fCursor = False
    WinSetOnTop($hCursor, '', 0)
    GUISetState(@SW_HIDE, $hCursor)
    EndIf
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndIf
    If $nCode = 0 Then ; == $HC_ACTION = 0
    If Not $fCursor Then
    $fCursor = True
    GUISetState(@SW_SHOWNOACTIVATE, $hCursor)
    WinSetOnTop($hCursor, '', 1)
    EndIf
    Switch $wParam
    Case $WM_MOUSEMOVE
    WinMove($hCursor, '', $iX-24, $iY-24)
    Case $WM_LBUTTONDOWN
    ;
    Case $WM_LBUTTONUP
    ;
    Case $WM_RBUTTONDOWN
    ;
    Case $WM_RBUTTONUP
    ;
    Case $WM_MBUTTONDOWN
    ;
    Case $WM_MBUTTONUP
    ;
    EndSwitch
    EndIf
    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

    [/autoit]

    Ich verfüge jedoch über garkeine Grundkentnisse und weiß nun nicht wirklich, was ich damit Anfangen soll. Die Handle habe ich meiner Meinung nach schon mit AutoIt herausgefunden und in den Code eingetragen, jedoch erhalte ich dann beim betreten des Fensters die Fehlermeldung:

    Line 2575 (File "C:\Users\xxxx\Downloads\undjetzt.exe
    Error: Subscript used with non-Array aviable

    Wenn mir jemand Helfen könnte, wäre ich sehr dankbar, wobei das eher an die Hand nehmen wird,
    da ich wirklich wenig Ahnung habe, was ich hier gerade tue.

    Grüße

    • Offizieller Beitrag

    Ich hatte dir geschrieben, dass du das Skript noch anpassen musst (u.a. Handleermittlung des Zielfensters zur Laufzeit).
    Dieses von mir gepostete Skript ist nur eines aus meiner Bsp.mappe leicht angepasst auf dein Ziel (und so nicht laufffähig -> Handle). Den Mauscursor musst du noch ersetzen - wie hatte ich dir auch schon gesagt.
    Es ist jetzt erst mal an dir, die Empfehlungen und HInweise umzusetzen.