Zitat@ SEuBo hab dir auch schon im anderen Forum gesagt, dass du vergessen hast, in die Exit Funktion das DLLClose einzubauen
Ich habs auch vergessen ....
Zitat@ SEuBo hab dir auch schon im anderen Forum gesagt, dass du vergessen hast, in die Exit Funktion das DLLClose einzubauen
Ich habs auch vergessen ....
Zitatname22: Dein script klappt bei mir nicht , keine ahnung warum. Habe auch die DLLCLose funktion eingebaut
Bei mir funktioniert es... Versuch mal die rechte STRG Taste bei _IsPressed durch eine andere Taste zu ersetzen.
Hallo,
[autoit]If _IsPressed("A3", $vU32DLL) Then
[/autoit]
behandelt auch nur die rechte Ctrl/Strg-Taste!
so werden beide Ctrl/Strg-Tasten berücksichtig!
[autoit]If _IsPressed("A2", $vU32DLL) Or _IsPressed("A3", $vU32DLL) Then
[/autoit]wie bekommt man das hin, dass man mit euren programmen auch in Direct X anwendungen malen kann?
ich habs ausprobiert bei mir funktionierts nicht
Zitatwie bekommt man das hin, dass man mit euren programmen auch in Direct X anwendungen malen kann?
Das geht so leider nicht ;). Und ich bin mir nicht mal sicher, ob es überhaupt in AutoIt möglich ist...
Mit GDI+ gehts, aber es flackert dann sehr stark. DirectX ist einfach viel schneller als GDI+
ZitatMit GDI+ gehts, aber es flackert dann sehr stark
Ist ja auch logisch, wenn du versuchst auf ein Fenster zu malen während eine andere Anwendung gerade das selbe, womöglich noch mit einer anderen Framerate, macht...
Man kann versuchen das Fenster über alle "OnTop" Fenster (z.B. Task Manager, oder viele PC Spiele) zu setzen. Ich habe mal einen _WinApi Befehl dafür gefunden, aber ich weiß nicht mehr wie dieser heißt... :pinch:
hm ich such auch mal
das wär schon witzig wenn das gehen würde
EDIT: geht das vielleicht besser mit _WinAPI_FillRect() ??
Hab den Befehl wiedergefunden :D.
So kann man zumindest schon mal auf den TaskManager zeichnen... Aber ob das jetzt auch bei DirectX Anwendungen klappt .
#include <GDIPlus.au3>
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <Misc.au3>
#include <Constants.au3>
Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]HotKeySet("{ESC}", "_Exit")
[/autoit] [autoit][/autoit] [autoit]$vU32DLL = DllOpen("User32.dll")
[/autoit] [autoit][/autoit] [autoit]$iGUIColorBG = 0xFFFFFFFF
$iGUIWidth = @DesktopWidth
$iGUIHeight = @DesktopHeight
$hWnd = GUICreate("Test", $iGUIWidth, $iGUIHeight, 0, 0, BitOR(0x80000000, 0x08000000), BitOR(0x00080000, 0x00000008, 0x00000080))
GUISetState()
_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 = _GDIPlus_PenCreate(0xFF000000, 2)
[/autoit] [autoit][/autoit] [autoit]$hDC = _WinAPI_GetDC($hWnd)
$hCDC = _WinAPI_CreateCompatibleDC($hDC)
$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)
GUIRegisterMsg($WM_PAINT, "_ReDraw")
$aMousePosOld = MouseGetPos()
While True
$aMousePosNew = MouseGetPos()
If _IsPressed("A3", $vU32DLL) Or _IsPressed("A2", $vU32DLL) Then
If $aMousePosOld[0] <> $aMousePosNew[0] Or $aMousePosOld[1] <> $aMousePosNew[1] Then _GDIPlus_GraphicsDrawLine($hBuffer, $aMousePosOld[0], $aMousePosOld[1], $aMousePosNew[0], $aMousePosNew[1], $hPen)
_ReDraw()
EndIf
If BitOR(WinGetState($hWnd), 2) <> 2 Then _WinAPI_SetWindowPos($hWnd, $HWND_TOPMOST, 0, 0, 0, 0, BitOR($SWP_NOMOVE, $SWP_NOSIZE))
$aMousePosOld = $aMousePosNew
WEnd
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 _Exit()
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_PenDispose($hPen)
_GDIPlus_Shutdown()
DllClose($vU32DLL)
Exit
EndFunc
Edit: Mit linker oder rehcter Strg Taste zeichnen.
hm ich sehe das gemalte erst wenn ich die anwendung beende
D3D Programme gehen bei mir nichtmehr, wenn ich mit deinem Script male
€: Jetzt gehts doch, aber ich kann in dem D3D Fenster nicht malen, nur außerhalb^^
Und Buttons und so kann man nichtmehr anklicken, wenn amn die übermalt.
Ich konnte mit dem programm wo man Rot malt in Counter-Strike:Source malen.
Vielleicht lag es daran , dass ich ihm Fenster Modus spiele
ZitatVielleicht lag es daran , dass ich ihm Fenster Modus spiele
Ja, das wäre gut möglich...
Eine kleine Frage: Wie kann man bei deinem Script eine funktionsfähige GUI erstellen? Wenn ich ganz normal eine erstelle, kann ich keine Buttons mehr anklicken
Scheinbar wird die 2te GUI immer deaktiviert, weil sie sonst vor dem 1ten Fenster währe. Du kannst den _WinApi_SetWindowPos Befehl entfernen, aber musst dann auch darauf verzichten, dass auch über Fenster wie TaskManager etc. gezeichnet werden kann.
Hm.. komisch, Exit Button, Menü, Slider, usw funktionieren, nur Buttons nicht. Naja, habs jetzt mit GUIGetCursorInfo gelöst.
Und Buttons und so kann man nichtmehr anklicken, wenn amn die übermalt
Also bei mir funktioniert es? Hier nochmal mit ner zusätzlichen GUI (und Button)
#include <Misc.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
;Variablen deklarieren
Local $hGUI, $hGraphics, $hBitmap, $hBackBuffer, $hPen
Local $hDLL, $aMPos, $aMPos_New
;GDI+ initialisieren, DLL für _IsPressed öffnen und ESC als HotKey festlegen
_GDIPlus_Startup()
$hDLL = DllOpen("user32.dll")
HotKeySet("{ESC}", "_Exit")
;Transparente GUI erstellen
$hDummy = GUICreate("") ; Dummy GUI, damit richtiges nicht in Taskleiste auftaucht.
$hGUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TRANSPARENT), $hDummy)
GUISetBkColor(0xABCDEF, $hGUI)
_WinAPI_SetLayeredWindowAttributes($hGUI, 0xABCDEF, 255)
;Graphic-Objekt, Pinsel und Backbuffer erstellen und GUI anzeigen
$hPen = _GDIPlus_PenCreate(0xFFFF0000, 4) ; Roten Pinsel mit Breite von 4 px.
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics(@DesktopWidth, @DesktopHeight, $hGraphics)
$hBackBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
GUISetState()
$hTest = GUICreate("")
$cButton = GUICtrlCreateButton("123", 10, 10, 200, 20)
GUISetState()
While Sleep(10)
[/autoit] [autoit][/autoit] [autoit]$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case $cButton
MsgBox(0, "", "test")
Case Else
$aMPos = MouseGetPos()
While _IsPressed(10, $hDLL)
$aMPos_New = MouseGetPos()
;~ If Not IsArray($aMPos) Then $aMPos = $aMPos_New
If $aMPos[0] <> $aMPos_New[0] Or $aMPos[1] <> $aMPos_New[1] Then
_GDIPlus_GraphicsDrawLine($hBackBuffer, $aMPos[0], $aMPos[1], $aMPos_New[0], $aMPos_New[1], $hPen)
_GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
$aMPos = $aMPos_New
EndIf
WEnd
EndSwitch
WEnd
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _Exit()
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_PenDispose($hPen)
GUIDelete($hGUI)
Exit
EndFunc ;==>_Exit
Es geht um das Script von name22, welches auch bei D3D Fenster geht
ZitatUnd Buttons und so kann man nichtmehr anklicken, wenn amn die übermalt.
Ja, mein Script macht im Prinzip nur die sichtbaren Teile des Fensters klickbar... Aber ist das ein problem? Ich meine wieso sollte ich unbedingt etwas anklicken wollen, wenn ich es noch nicht einmal sehen kann? Ich hatte bis jetzt auch nie das verlangen, durch das Firefox Fenster hindurch auf meinem Dekstop herumzuklicken .