Mauscursor zeichnen (WinAPI / GDI / Icon)

  • Hallo,

    Ich würde gerne mit AutoIt den Mauszeiger auf den Bildschirm zeichnen lassen. Entweder per WinAPI, GDI oder ganz einfach mit einem Bild, das ich immer an die aktuelle Mausposition verschiebe. Hintergrund: Es gibt einen Bug mit dem DivX Web Player. Sobald man eins oder mehrere Videos im Vollbildmodus anschaut, verschwindet der Mauszeiger im Browser. Ich kann zwar immer noch alles anklicken (und auch auf dem Desktop ist der Cursor noch da ), aber nervig ist es trotzdem. Es hilft nur den Browser neu zu starten - das ist aber nicht immer möglich (laufende Downloads, Chats usw usw.)

    Meine bisherigen versuche sehen so aus: (Bitte nicht lachen ich hatte ne verdammt kurze Nacht)

    [autoit]


    ; was soll ich sagen... es erfüllt seinen Zweck xD
    While 1 * Sleep(10)
    ToolTip("<-",MouseGetPos(0)+5,MouseGetPos(1)-10)
    WEnd

    [/autoit]

    hier ne GDI-variante (klappt definitiv nicht so wie ich will)

    [autoit]


    ;Achtung! Anfänger am Werk!

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

    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <WinAPI.au3>
    _GDIPlus_Startup ()
    Do
    Sleep(20)
    _DrawMouse()
    Until GUIGetMsg() = -3

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

    Func _DrawMouse()
    Local $mPos, $hDC, $hGraphic, $hPen
    $mPos = MouseGetPos()
    $hDC = _WinAPI_GetWindowDC(0)
    $hGraphic = _GDIPlus_GraphicsCreateFromHDC ($hDC)
    $hPen = _GDIPlus_PenCreate ()
    _GDIPlus_GraphicsDrawLine ($hGraphic, $mPos[0], $mPos[1], $mPos[0], $mPos[1]+15, $hPen)
    _GDIPlus_GraphicsDrawLine ($hGraphic, $mPos[0], $mPos[1], $mPos[0]+12, $mPos[1]+12, $hPen)
    _GDIPlus_GraphicsDrawLine ($hGraphic, $mPos[0], $mPos[1]+15, $mPos[0]+12, $mPos[1]+12, $hPen)
    _GDIPlus_GraphicsDrawLine ($hGraphic, $mPos[0]+6, $mPos[1]+14, $mPos[0]+9, $mPos[1]+20, $hPen)
    _GDIPlus_PenDispose ($hPen)
    _GDIPlus_GraphicsDispose ($hGraphic)
    EndFunc
    _GDIPlus_Shutdown ()

    [/autoit]

    Ich habe übrigens noch nie mit GDI gearbeitet - verzeiht mir also den lausigen Code ^^
    Wie könnt ich das also anstellen?

  • Workaround: ich weiß nicht, ob das funzt: In den Eigenschaften der Maus kann man die Option "Zeigerposition beim Drücken der STRG-Taste anzeigen" wählen. Vielleicht kannst du dann die Mausposition ungefähr sehen.

    Vielleicht fällt mir zu GDI+ noch was ein, aber leider muss ich heute ins RZ nach Frankfurt.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • ja gehen tut das natürlich schon, aber komfortabel ist das natürlich nicht. Alternativ kann ich auch die Maus auf die Taskleiste ziehen, die Linke maustaste gedrückt halten und dann wieder in den Browser ziehen. Solange ich die Maustaste nicht loslasse ist die Maus auch sichtbar. Allerdings wollte ich diese AutoIt lösung benutzen, damit ich mich halt nich ständig mit Workarounds rumquälen muss

    Wär natürlich super wenn dir was einfällt

    Gruß SEuBo

  • Bei mir liegt gerade so was rum:

    Spoiler anzeigen
    [autoit]

    #include<GUIConstantsEx.au3>
    #include<WindowsConstants.au3>
    Opt('TrayAutoPause', 0)
    TraySetClick(8)
    $crosscolor = 0xFF0000
    #region - GUI Create
    $gui = GUICreate('MouseCross',25,25,-1,-1,$WS_POPUP,$WS_EX_TOOLWINDOW+$WS_EX_LAYERED+$WS_EX_TRANSPARENT+$WS_EX_TOPMOST)
    $transcol = 0xABCDEF
    If $crosscolor = $transcol Then $transcol = 0xFBCDEF
    GUISetBkColor($transcol)
    GUICtrlCreateLabel("",11,0,3,10)
    GUICtrlSetBkColor(-1,$crosscolor)
    GUICtrlCreateLabel("",11,15,3,10)
    GUICtrlSetBkColor(-1,$crosscolor)
    GUICtrlCreateLabel("",0,11,10,3)
    GUICtrlSetBkColor(-1,$crosscolor)
    GUICtrlCreateLabel("",15,11,10,3)
    GUICtrlSetBkColor(-1,$crosscolor)
    GUISetState()

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

    #endregion
    _API_SetLayeredWindowAttributes($gui,$transcol)

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

    #region - GUI SelectLoop
    While 1
    WinMove($gui,"",MouseGetPos(0)-12,MouseGetPos(1)-12)
    Sleep(10)
    WEnd
    #endregion

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

    ;===============================================================================
    ;
    ; Function Name: _API_SetLayeredWindowAttributes
    ; Description:: Sets Layered Window Attributes:) See MSDN for more informaion
    ; Parameter(s):
    ; $hwnd - Handle of GUI to work on
    ; $i_transcolor - Transparent color
    ; $Transparency - Set Transparancy of GUI
    ; $isColorRef - If True, $i_transcolor is a COLORREF-Strucure, else an RGB-Color
    ; Requirement(s): Layered Windows
    ; Return Value(s): Success: 1
    ; Error: 0
    ; @error: 1 to 3 - Error from DllCall
    ; @error: 4 - Function did not succeed - use
    ; _WinAPI_GetLastErrorMessage or _WinAPI_GetLastError to get more information
    ; Author(s): Prog@ndy
    ;
    ;===============================================================================
    ;
    Func _API_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $isColorRef = False)

    Local Const $AC_SRC_ALPHA = 1
    Local Const $ULW_ALPHA = 2
    Local Const $LWA_ALPHA = 0x2
    Local Const $LWA_COLORKEY = 0x1
    If Not $isColorRef Then
    $i_transcolor = Hex(String($i_transcolor), 6)
    $i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))
    EndIf
    Local $Ret = DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hwnd, "long", $i_transcolor, "byte", $Transparency, "long", $LWA_COLORKEY + $LWA_ALPHA)
    Select
    Case @error
    Return SetError(@error,0,0)
    Case $ret[0] = 0
    Return SetError(4,0,0)
    Case Else
    Return 1
    EndSelect
    EndFunc ;==>_API_SetLayeredWindowAttributes

    [/autoit]
  • Super, danke !
    Mehr brauch ich eigentlich garnicht - merci :thumbup:

    Rein aus interesse: Wo liegt der Fehler in meiner GDI Version, dass

    1. Die maus zig mal gezeichnet wird, obwohl ich doch extra _GDIPlus_GraphicsDispose ($hGraphic) verwende
    2. Die gezeichnete(n) Maus (Mäuse) verschwinden, sobald ein Fenster eigentständig redrawt? Also wenn zb ein tooltip kommt, oder ich die Fenstergröße verändere.

  • 1. Die maus zig mal gezeichnet wird, obwohl ich doch extra _GDIPlus_GraphicsDispose ($hGraphic) verwende

    Das löscht das Grafik-Objekt, aber nicht die Grafik auf dem Bildschirm.

    2. Die gezeichnete(n) Maus (Mäuse) verschwinden, sobald ein Fenster eigentständig redrawt? Also wenn zb ein tooltip kommt, oder ich die Fenstergröße verändere.

    Du zeichnest auf andere Fenster und nicht auf ein eigenes. Wenn diese sich neu zeichnen, verschwindet eben auch deine Grafik.