Mausverfolger oder Wie kann ich etwas "direkt" auf den Bildschirm malen

  • Folgendes Script zeigt, wie man quasi "direkt" auf den Bildschirm malen kann.

    Spoiler anzeigen
    [autoit]

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

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

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

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

    Global $aPos[11][2], $iXOld, $iYOld

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

    $hGui = GUICreate("Mausverfolger", @DesktopWidth, @DesktopHeight, -1, -1, $WS_POPUP, BitOR($WS_EX_TRANSPARENT, $WS_EX_LAYERED, $WS_EX_TOPMOST))
    GUISetBkColor(0xABCDEF)
    _WinAPI_SetLayeredWindowAttributes($hGui, 0xABCDEF, 255)
    GUISetState(@SW_SHOW, $hGui)

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

    _GDIPlus_Startup()
    $hBrush = _GDIPlus_BrushCreateSolid(0xFFFF9900)
    $hBrushDel = _GDIPlus_BrushCreateSolid(0xFFABCDEF)
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)

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

    While 1
    For $i = 0 To 9
    $aPos[$i][0] = $aPos[$i + 1][0]
    $aPos[$i][1] = $aPos[$i + 1][1]
    Next
    $iXOld = $aPos[10][0]
    $iYOld = $aPos[10][1]
    $aPos[10][0] = MouseGetPos(0)
    $aPos[10][1] = MouseGetPos(1)
    For $i = 0 To 10
    If $i = 10 And $aPos[10][0] = $iXOld And $aPos[10][1] = $iYOld Then ContinueLoop
    _GDIPlus_GraphicsFillRect($hGraphics, $aPos[$i][0], $aPos[$i][1], 2.5 * $i, 2.5 * $i, $hBrush)
    Next
    Sleep(10)
    For $i = 0 To 10
    If $i < 10 And $aPos[$i][0] = $aPos[10][0] And $aPos[$i][1] = $aPos[10][1] Then ContinueLoop
    If $i = 10 And $aPos[10][0] = $iXOld And $aPos[10][1] = $iYOld Then ContinueLoop
    _GDIPlus_GraphicsFillRect($hGraphics, $aPos[$i][0], $aPos[$i][1], 2.5 * $i, 2.5 * $i, $hBrushDel)
    Next
    WEnd

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

    Func _WinAPI_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $dwFlages = 0x03, $isColorRef = False)
    If $dwFlages = Default Or $dwFlages = "" Or $dwFlages < 0 Then $dwFlages = 0x03
    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", $dwFlages)
    Select
    Case @error
    Return SetError(@error, 0, 0)
    Case $Ret[0] = 0
    Return SetError(4, _WinAPI_GetLastError(), 0)
    Case Else
    Return 1
    EndSelect
    EndFunc ;==>_WinAPI_SetLayeredWindowAttributes

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]


    Viel Spaß
    E

    • Offizieller Beitrag

    Wo wir grade beim Thema sind: kann man mit AutoIt eigentlich ein FIFO machen?


    Standardmäßig wird von AutoIt (leider mal wieder) nur für 1D-Arrays Push und Pop angeboten. Deshalb hatte ich diese Funktionen auch für 2D-Array erstellt: ArrayMore.au3

  • HEY, ich hab aus dem Script was ganz kuwles gemacht!!!!!! :thumbup: :thumbup: :thumbup: :thumbup: :D

    Spoiler anzeigen
    [autoit]

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

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

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

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

    Global $aPos[11][2], $iXOld, $iYOld

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

    $hGui = GUICreate("Mausverfolger", @DesktopWidth, @DesktopHeight, -1, -1, $WS_POPUP, BitOR($WS_EX_TRANSPARENT, $WS_EX_LAYERED, $WS_EX_TOPMOST))
    GUISetBkColor(0xABCDEF)
    _WinAPI_SetLayeredWindowAttributes($hGui, 0xABCDEF, 255)
    GUISetState(@SW_SHOW, $hGui)

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

    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hPen = _GDIPlus_PenCreate ()

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

    _GDIPlus_GraphicsDrawLine($hGraphics, @DesktopWidth/2-20, @DesktopHeight/2, @DesktopWidth/2-5, @DesktopHeight/2,$hPen)
    _GDIPlus_GraphicsDrawLine($hGraphics, @DesktopWidth/2+5, @DesktopHeight/2, @DesktopWidth/2+20, @DesktopHeight/2,$hPen)

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

    _GDIPlus_GraphicsDrawLine($hGraphics, @DesktopWidth/2, @DesktopHeight/2-20, @DesktopWidth/2, @DesktopHeight/2-5,$hPen)
    _GDIPlus_GraphicsDrawLine($hGraphics, @DesktopWidth/2, @DesktopHeight/2+5, @DesktopWidth/2, @DesktopHeight/2+20,$hPen)

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

    while 1
    sleep(100)
    wend

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

    ;ContinueLoop

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

    Func _WinAPI_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $dwFlages = 0x03, $isColorRef = False)
    If $dwFlages = Default Or $dwFlages = "" Or $dwFlages < 0 Then $dwFlages = 0x03
    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", $dwFlages)
    Select
    Case @error
    Return SetError(@error, 0, 0)
    Case $Ret[0] = 0
    Return SetError(4, _WinAPI_GetLastError(), 0)
    Case Else
    Return 1
    EndSelect
    EndFunc ;==>_WinAPI_SetLayeredWindowAttributes

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]
  • Ohoh, ich seh schon wie die Kids sich jetzt zusätzliche Fadenkreuze auf ihre Monitore "malen" lassen...

    hm @Oger-Lord:
    Was meinst du soll dir das sagen?
    Ich meine es ist schon lustig... Aber irgendwie dämlich^^

    Padmak

  • ;)
    Musste aber gerade mit entsetzten feststellen das es garnicht funktioniert, sobald das Spiel geöffnet wird verschwindet das Fadenkreuz ;( :D

  • Ach nein :D
    Ist doch logisch:
    AutoIt erstellt eine GUI, die so "unwichtig" ist, dass das Spiel sie einfach ignoriert^^
    mein Bruder wollte das auch für sich nutzen^^
    aber wenigstens hab ich jetzt was zu lachen^^

    Padmak

    Ps: Weiß zufällig einer wie man des Kreuz Ontop lassen kann? :D

  • OpenGL setzt sich logischerweise über die normale Oberfläche.
    Da muss man größere Eingriffe in das Spiel vornehmen, was nicht ganz einfach ist und womit man sich lange beschäftigen muss.
    Abgesehen davon haben die Spiele dann normalerweise einen Schutz, der solche Eingriffe verhindert, wodurch wir dann wieder bei den Forenregeln wären...

  • Ja das mit den Forenregeln war mir klar^^
    des sollte ja nur ein Witz sein, ich würd sowas niemals hier fragen
    man könnte auch D3D nehmen, aber das check ich sicher net^^

    Naja BTT:
    Dein Script (eukalyptus) ist echt super geworden, respekt!
    ich find des total lustig :D
    Padmak

  • @Oger-Lord

    jetzt sollte man nurnoch das fadenkreuz iwie färben! weiss einer wie? xD

    EDIT1:
    hatte genug zeit ma angeguckt ^^ hier die lösung

    suche
    $hPen = _GDIPlus_PenCreate ()
    ersetze durch
    $hPen = _GDIPlus_PenCreate (0xFFFF0000)

    Einmal editiert, zuletzt von K1773R (17. Februar 2009 um 11:40)

  • hatte genug zeit ma angeguckt ^^ hier die lösung
    suche
    $hPen = _GDIPlus_PenCreate ()
    ersetze durch
    $hPen = _GDIPlus_PenCreate (0xFFFF0000)


    Ach nein^^
    ist auch sehr schwer :D
    Einfach die Farbe ändern...
    Aber das bringts eh nicht -> verschwindet bei Spielen

    Padmak