Thread

  • Ein kumpel wollte einen Blinkenden Punkt auf dem Bildschirm haben. Dazu hab ich ein programm geschrieben.
    Der punkt soll immer da sein. Wenn er nun ein Spiel startet überschneiden sich 2 Programme.
    AutoIT versucht den punkt beizubehalten troz des Spieles. Das funzt. Doch die interaktion im Spiel wird probleatisch.
    Was passiert: Er hat das spiel gestartet, das problem außert sich wie wenn man "Windowstaste" drückt wärend des spiels. Versucht man dann wieder in das spiel zu kommen lost es wieder "Windowstaste" aus.

    Gibt es eine Möglichkeit das Autoit programm als Hintergrund prozess zu staten in einem eigenen Thread?

    Spoiler anzeigen
    [autoit]


    #include<GUIConstantsEx.au3>
    #include<WindowsConstants.au3>
    $read = "Gruen"
    $color2 = 0x00FF00
    AdlibRegister ( "_Test1" , 500 )
    AdlibRegister ( "_Test2" , 1000 )
    AdlibRegister ( "_Test3" , 1500 )

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

    While 1
    WEnd

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

    Func _Test1 ()
    $read = "Gruen"
    Dim $color2 = 0x00FF00
    _setPixel(@DesktopWidth / 2, @DesktopHeight / 2, 4, 4)
    ;MsgBox (64, "Farbe", $read )
    EndFunc

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

    Func _Test2 ()
    $read = "Blau"
    Dim $color2 = 0x0000FF
    _setPixel(@DesktopWidth / 2, @DesktopHeight / 2, 4, 4)
    ;MsgBox (64, "Farbe", $read )
    EndFunc

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

    Func _Test3 ()
    $read = "Rot"
    Dim $color2 = 0xFF0000
    _setPixel(@DesktopWidth / 2, @DesktopHeight / 2, 4, 4)
    ;MsgBox (64, "Farbe", $read )
    EndFunc

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

    Func _setPixel($left, $top, $width = 5, $height = 5, $color = $color2 )
    GUICreate("", $width, $height, $left, $top, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
    GUISetBkColor($color)
    GUISetState(@SW_SHOW)
    EndFunc ;==>_setPixel

    [/autoit]

    Einmal editiert, zuletzt von Skar (3. Januar 2011 um 13:04)

  • Da bei jedem aktuallisieren der Farben der Fokus auf die GUI gesetzt wird, ist das klar. Müsstest also irgendwie mit Auotit auf DirectX zugreifen und es direkt in das Spiel reinzeichnen.

    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.

  • Dein "Kumpel" ist da wesentlich einfacher und "sicherer" fertig wenn er einfach aus so einem Klebezettel sich einen Punkt ausschneidet und auf den Bildschirm klebt.

    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.

    Einmal editiert, zuletzt von chip (3. Januar 2011 um 11:57)

  • Ich finde diese Skript von name22 für diese Zwecke ganz gut geeignet (hab's ein kleines bisschen angepasst):

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #include <Misc.au3>
    #include <Constants.au3>

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

    Opt("GUIOnEventMode", 1)
    AdlibRegister("setColor", 500)
    HotKeySet("{ESC}", "_Exit")
    Global $hBrush[4], $hPen[4]
    $iGUIColorBG = 0xFFFFFFFF
    $iGUIWidth = @DesktopWidth
    $iGUIHeight = @DesktopHeight

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

    $hWnd = GUICreate("Test", $iGUIWidth, $iGUIHeight, 0, 0, BitOR(0x80000000, 0x08000000), BitOR(0x00080000, 0x00000008, 0x00000080))
    GUISetState()

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
    $hPen[0]=_GDIPlus_PenCreate(0xFF00FF00)
    $hBrush[0]=_GDIPlus_BrushCreateSolid(0xFF00FF00)
    $hPen[1]=_GDIPlus_PenCreate(0xFF0000FF)
    $hBrush[1]=_GDIPlus_BrushCreateSolid(0xFF0000FF)
    $hPen[2]=_GDIPlus_PenCreate(0xFFFF0000)
    $hBrush[2]=_GDIPlus_BrushCreateSolid(0xFFFF0000)
    $hDC = _WinAPI_GetDC($hWnd)
    $hCDC = _WinAPI_CreateCompatibleDC($hDC)

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

    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $iGUIWidth)
    DllStructSetData($tSize, "Y", $iGUIHeight)
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", 255)
    DllStructSetData($tBlend, "Format", 1)
    $tPoint = DllStructCreate($tagPOINT)
    $pPoint = DllStructGetPtr($tPoint)
    DllStructSetData($tPoint, "X", 0)
    DllStructSetData($tPoint, "Y", 0)

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

    GUIRegisterMsg($WM_PAINT, "_ReDraw")
    $hTimer=TimerInit()
    While sleep(10)
    _GDIPlus_GraphicsDrawRect($hBuffer, @DesktopWidth/2, @DesktopHeight/2, 4, 4, $hPen[3])
    _GDIPlus_GraphicsFillRect($hBuffer, @DesktopWidth/2, @DesktopHeight/2, 4, 4, $hBrush[3])
    _ReDraw()
    If BitOR(WinGetState($hWnd), 2) <> 2 Then _WinAPI_SetWindowPos($hWnd, $HWND_TOPMOST, 0, 0, 0, 0, BitOR($SWP_NOMOVE, $SWP_NOSIZE))
    WEnd

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

    Func _ReDraw()
    Local $hBitmapTmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _WinAPI_SelectObject($hCDC, $hBitmapTmp)
    _WinAPI_UpdateLayeredWindow($hWnd, $hDC, 0, $pSize, $hCDC, $pSource, 0, $pBlend, 2)
    _WinAPI_DeleteObject($hBitmapTmp)
    EndFunc
    Func setColor()
    Local Static $iColor=0
    $iColor+=1
    If $iColor=3 Then $iColor=0
    $hPen[3]=$hPen[$iColor]
    $hBrush[3]=$hBrush[$iColor]
    EndFunc
    Func _Exit()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    For $i=0 to 2
    _GDIPlus_PenDispose($hPen[$i])
    _GDIPlus_BrushDispose($hBrush[$i])
    Next
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]
  • WOW das funktioniert. Der punkt ist bei programmen immer in vodergrund. Nur bei Programmen im Vollbildmodus wandert es in den Hintergrund. Das ist das problem jetzt grade. Mit dem Skript von oben.


    Mich würde jetzt noch interresieren wie das genau mit der GUI+ funktioniert. Ich habe den Tread von name22 auch vorhin gefunden.

  • Zitat

    Nur bei Programmen im Vollbildmodus wandert es in den Hintergrund. Das ist das problem jetzt grade. Mit dem Skript von oben.


    Bei manchen Programmen/Spielen geht das dann so wahrscheinlich nicht. Das Fenster ist immer vor allen anderen Topmost Fenstern (z.B. TaskManager) mehr geht auf diese Weise nicht. Dann müsste man wohl direkt in das Fenster des Spiels zeichnen, was mit AutoIt vermutlich nur schwer realisierbar wäre.

    Zitat

    Mich würde jetzt noch interresieren wie das genau mit der GUI+ funktioniert


    Was meinst du? Die GUI in meinem Script ist ein mehrschichtiges Fenster, also mit dem Stil $WS_EX_LAYERED. Durch den Befehl _WinAPI_UpdateLayeredWindow kann man eine Bitmap in das Fenster reinkopieren und die transparenten Bereiche bleiben auch im Fenster transparent.

  • Ich danke für die Lösung. Ich werde mich mal mit dem oberen skript auseinsandersetzen um es zu verstehen.
    Ich denke da nicht mehr geht aber ich was gelernt hab ^^ und es für viele sachen geht im fenstermodus, denk ich das ich nun den Tread schließen kann ^^.
    Danke bis zum nächsten mal