Hilfe mit GDIPlus

  • Hallo Leute,

    Ich hab mal wieder an meinem Editor geschrieben und bin auf ein Problem gestoßen...
    Das Bild flackert immer :thumbdown:
    Ich möchte den Fehler gerne beheben aber ich weis nicht was ich verändern soll.
    Ich glaube das hängt mit meinen 2 Buffern zsm.

    Über Hilfe würde ich mich sehr freuen :thumbup:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>

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

    Global $hGuiH = 640 ,$hGuiW = 640,$hGuiTitle = "NewMap",$iLastmX = "",$iLastmY = ""

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

    $hGui = GUICreate($hGuiTitle,$hGuiH,$hGuiW)
    GUISetState(@SW_SHOW)

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

    _GDIPlus_Startup()

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

    $hGr_Frontbuffer = _GDIPlus_GraphicsCreateFromHWND($hGUI)

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

    $hBitmap_Backbuffer = _GDIPlus_BitmapCreateFromGraphics($hGuiW,$hGuiH , $hGr_Frontbuffer)

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

    $hGr_Backbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap_Backbuffer)
    $hGr_OverBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap_Backbuffer)

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

    _GDIPlus_GraphicsClear($hGr_Backbuffer)

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

    $hGlas = _GDIPlus_ImageLoadFromFile(@ScriptDir&"\NewGlassRed2.png");Irgend ein 32x32px png

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

    While 1
    If GUIGetMsg() = -3 Then Exit
    If WinActive($hGuiTitle) Then
    $iMousePos = GUIGetCursorInfo()
    For $a = 0 To $hGuiH Step 32
    For $b = 0 To $hGuiW Step 32
    If $a + 32 > $iMousePos[0] And $a < $iMousePos[0] + 1 And $b + 32 > $iMousePos[1] And $b < $iMousePos[1] + 1 Then
    _GDIPlus_GraphicsClear($hGr_OverBackbuffer)
    _GDIPlus_GraphicsDrawRect($hGr_OverBackbuffer,$a,$b,32,32,_GDIPlus_PenCreate(0xFFFFFFFF))
    EndIf
    Next
    Next
    EndIf
    If _IsPressed(01) And WinActive($hGuiTitle) Then
    $iMousePos = GUIGetCursorInfo()
    For $a = 0 To $hGuiH Step 32
    For $b = 0 To $hGuiW Step 32
    If $a + 32 > $iMousePos[0] And $a < $iMousePos[0] + 1 And $b + 32 > $iMousePos[1] And $b < $iMousePos[1] + 1 Then
    If $a = $iLastmX And $b = $iLastmY Then
    ;
    Else
    _GDIPlus_GraphicsFillRect($hGr_Backbuffer,$a,$b,32,32)
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer,$hGlas,$a,$b)
    EndIf
    $iLastmX = $a
    $iLastmY = $b
    EndIf
    Next
    Next
    EndIf
    If _IsPressed(02) And WinActive($hGuiTitle) Then
    $iMousePos = GUIGetCursorInfo()
    For $a = 0 To $hGuiH Step 32
    For $b = 0 To $hGuiW Step 32
    If $a + 32 > $iMousePos[0] And $a < $iMousePos[0] + 1 And $b + 32 > $iMousePos[1] And $b < $iMousePos[1] + 1 Then
    _GDIPlus_GraphicsFillRect($hGr_Backbuffer,$a,$b,32,32)
    EndIf
    Next
    Next
    EndIf

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

    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer,$hGr_OverBackbuffer,0,0)
    _GDIPlus_GraphicsDrawImage($hBitmap_Backbuffer,$hGr_Backbuffer,0,0)

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

    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer,$hBitmap_Backbuffer,0,0)

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

    WEnd

    [/autoit]


    Hier mein Code bis jetzt.

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

    2 Mal editiert, zuletzt von F4R (29. Januar 2014 um 17:51)

  • warscheinlich liegt das daran das ich nicht weis wie man das macht :D

    Kannst du mir ja mal zeigen :)

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Ein lauffähiges Script wäre ganz hilfreich, falls du uns das zur Verfügung stellen könntest. ;)
    Auf Anhieb kann ich dir aber schon mal sagen, dass es keinen Unterschied macht, ob du in $hGr_Backbuffer oder $hGr_OverBackbuffer zeichnest. Beide sprechen nämlich die selbe Bitmap an.
    Daher ist diese Operation hinfällig:

    [autoit]

    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer,$hGr_OverBackbuffer,0,0)

    [/autoit]


    Und diese Zeile macht keinen Sinn, da die Funktion einen GraphicsContext als Parameter erwartet und nicht das Handle zu einer Bitmap:

    [autoit]

    _GDIPlus_GraphicsDrawImage($hBitmap_Backbuffer,$hGr_Backbuffer,0,0)

    [/autoit]

    Edit:

    Zitat

    warscheinlich liegt das daran das ich nicht weis wie man das macht :D

    Das kannst du unter anderem in der Hilfe zu _GDIPlus_PenCreate nachlesen ;). Mit _GDIPlus_PenDispose kannst du ein erstelltes Pen Objekt nach Gebrauch aus dem Arbeitsspeicher entfernen. Das Gleiche gilt übrigens für sämtliche GDI+ Objekte (die Funktionen sind ähnlich benannt und enthalten immer das Wort "Dispose", außerdem werden die Funktionen zum Entfernen normalerweise in Beschreibungen der Funktionen zum Erzeugen von Objetken erwähnt).

  • Habs editiert.

    Ich möchte Ja einen weisen Kasten um das Feld Zeichenen in dem sich die Maus gerade befindet und danach müsste
    ich das Bild ja resetten und dann wären auch die Bereits gezeichneten Kacheln weg... das wollen wir aber nicht :D

    Wenn es doch so geht wie beschrieben dann entschuldige ich mich schonmal im voraus :)

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Ich habe schon viel ausprobiert doch bei allen versuchen hat das Bild geflackert.

    Wenn die Maus im Bild ist soll ein weiser Rahmen um die Kachel erscheinen auf der die Maus gerade ist.
    Wenn die Maus geklickt wird soll die Kachel gezeichnet werden eben auch in der kachel in der die Maus ist.
    Rechtsklick mit der Maus soll die Angewählte Kachel wieder Löschen.

    Fals das ist was du wissen möchtest. :)

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Ich habe mal dein Script grundlegend überarbeitet, ich hoffe du hast nichts dagegen. Du hast mit deiner Version schon so viele potenzielle Probleme angefangen, dass es einfacher war den Hauptteil komplett neu zu schreiben.
    In dieser Version habe ich das WindowMessage Handling auf den OnEventMode umgestellt, so dass alles in Funktionen ausgelagert werden kann die dann automatisch ausgeführt werden. Den Teil des Programms der bestimmt in welcher Kachel sich die Maus befindet habe ich um einiges gekürzt (auf 2 kleine Zeilen) :whistling: . Des weiteren habe ich deine bisherigen Buffer und Bitmaps durch einen Backbuffer und einen "Tilebuffer" ersetzt. In die Tilebuffer Bitmap werden die Tiles gespeichert um sie danach auf den Backbuffer zu zeichnen woraufhin der weiße Rahmen ggf. darüberkommt. So muss möglichst wenig gezeichnet werden. Die Verfolgung des Mauszeigers habe ich über WindowMessages gemacht um das Script zu entlasten und die Performanz ein wenig zu verbessern.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <WinAPISys.au3>
    #include <Misc.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $hGuiH = 640, $hGuiW = 640, $iTileW = 32, $iTileH = 32, $hGuiTitle = "NewMap", $iLastmX = "", $iLastmY = ""

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

    $hGui = GUICreate($hGuiTitle, $hGuiH, $hGuiW)
    GUISetState(@SW_SHOW)

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

    _GDIPlus_Startup()

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

    $hGr_Frontbuffer = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hBitmap_Backbuffer = _GDIPlus_BitmapCreateFromGraphics($hGuiW, $hGuiH, $hGr_Frontbuffer)
    $hBitmap_Tilebuffer = _GDIPlus_BitmapCreateFromGraphics($hGuiW, $hGuiH, $hGr_Frontbuffer)
    $hGr_Backbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap_Backbuffer)
    $hGr_Tilebuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap_Tilebuffer)
    _GDIPlus_GraphicsClear($hGr_Backbuffer)
    _GDIPlus_GraphicsClear($hGr_Tilebuffer)

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

    $hGlas = _GDIPlus_ImageLoadFromFile(@DesktopDir & "\NewGlassRed2.png");Irgend ein 32x32px png
    $hPen = _GDIPlus_PenCreate(0xFFFFFFFF)
    $hBrush = _GDIPlus_BrushCreateSolid()

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

    _Redraw(False)

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

    OnAutoItExitRegister("_Shutdown")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Close")

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

    GUIRegisterMsg($WM_MOUSEMOVE, "_WM_Proc")
    GUIRegisterMsg($WM_MOUSELEAVE, "_WM_Proc")
    GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_Proc")
    GUIRegisterMsg($WM_RBUTTONDOWN, "_WM_Proc")
    GUIRegisterMsg($WM_PAINT, "_WM_PAINT")

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

    While Sleep(1000)
    WEnd

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

    Func _WM_Proc($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam, $lParam
    Local Static $iX_Mouse, $iY_Mouse, $iX_Grid, $iY_Grid, $bTracking = False

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

    Switch $iMsg
    Case $WM_MOUSEMOVE
    $iX_Mouse = _WinAPI_LoWord($lParam)
    $iY_Mouse = _WinAPI_HiWord($lParam)
    If Not $bTracking Then
    ConsoleWrite("MouseEnter" & @CRLF)
    _WinAPI_TrackMouseEvent($hGui, $TME_LEAVE)
    $bTracking = True
    EndIf
    $iX_Grid = Floor($iX_Mouse / $iTileW)
    $iY_Grid = Floor($iY_Mouse / $iTileH)
    If WinActive($hGui) Then _Redraw(True, $iX_Grid, $iY_Grid)
    Case $WM_MOUSELEAVE
    $bTracking = False
    _Redraw(False)
    ConsoleWrite("MouseLeave" & @CRLF)
    Case $WM_LBUTTONDOWN
    _TileAdd($iX_Grid, $iY_Grid)
    Case $WM_RBUTTONDOWN
    _TileDel($iX_Grid, $iY_Grid)
    EndSwitch
    EndFunc

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

    Func _Redraw($bBorder = True, $iX_NewGrid = Default, $iY_NewGrid = Default)
    Local Static $iX_Grid, $iY_Grid
    If $iX_NewGrid <> Default Then $iX_Grid = $iX_NewGrid
    If $iY_NewGrid <> Default Then $iY_Grid = $iY_NewGrid

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

    _GDIPlus_GraphicsClear($hGr_Backbuffer)
    _GDIPlus_GraphicsDrawImage($hGr_Backbuffer, $hBitmap_Tilebuffer, 0, 0)
    If $bBorder Then _GDIPlus_GraphicsDrawRect($hGr_Backbuffer, $iX_Grid * $iTileW, $iY_Grid * $iTileH, $iTileW, $iTileH, $hPen)
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    EndFunc

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

    Func _TileAdd($iX_NewGrid, $iY_NewGrid)
    _GDIPlus_GraphicsDrawImageRect($hGr_Tilebuffer, $hGlas, $iX_NewGrid * $iTileW, $iY_NewGrid * $iTileH, $iTileW, $iTileH)
    _Redraw()
    EndFunc

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

    Func _TileDel($iX_NewGrid, $iY_NewGrid)
    _GDIPlus_GraphicsFillRect($hGr_Tilebuffer, $iX_NewGrid * $iTileW, $iY_NewGrid * $iTileH, $iTileW, $iTileH, $hBrush)
    _Redraw()
    EndFunc

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

    Func _WM_PAINT()
    _GDIPlus_GraphicsDrawImage($hGr_Frontbuffer, $hBitmap_Backbuffer, 0, 0)
    EndFunc

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

    Func _Shutdown()
    _GDIPlus_BitmapDispose($hBitmap_Backbuffer)
    _GDIPlus_BitmapDispose($hBitmap_Tilebuffer)
    _GDIPlus_GraphicsDispose($hGr_Backbuffer)
    _GDIPlus_GraphicsDispose($hGr_Tilebuffer)
    _GDIPlus_GraphicsDispose($hGr_Frontbuffer)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_Shutdown()
    EndFunc

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

    Func _Close()
    Exit
    EndFunc

    [/autoit]
  • Sieht gut aus ich verstehe auch den Größten Teil xD
    Leider wird beim "Malen" das Gedrückt halten nicht unterstützt d.h. man muss immer einzeln Drücken
    Der rest ist echt super gemacht :D
    Danke name22 :thumbup:

    Könntest du mir noch Speziell erklären wie du das mit dem Buffer gemacht hast ? wäre echt nett !

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Zitat

    Könntest du mir noch Speziell erklären wie du das mit dem Buffer gemacht hast ? wäre echt nett !


    Gerne. Gibt es was Spezielles, das du nicht verstehst?
    Im Grunde mache ich das Gleiche wie davor schon mit dem Backbuffer. Ich erstelle eine Bitmap für den "Tilebuffer" in der das Bild für eine "Ebene" gespeichert wird. Danach erstelle ich für beide Bitmaps (Backbuffer, Tilebuffer) jeweils einen GraphicsContext über den dann schließlich Zeichenoperationen auf den Bitmaps durchgeführt werden können.
    Das war es im Grunde schon. Danach muss nur die Reihenfolge der Zeichenvorgänge in den einzelnen Ebenen und die Reihenfolge in der die Bitmaps auf die GUI gezeichnet werden, beachtet werden. Im Moment wird zuerst der Tilebuffer auf den Backbuffer gezeichnet, danach wird der weiße Rahmen auf den Backbuffer gezeichnet, dann wird der Backbuffer auf die GUI (Frontbuffer) gebracht. Du musst dabei einfach nur beachten, das die einzelnen Bitmaps im Grunde separate Ebenen sind und keinen Effekt auf die anderen Ebenen haben und das die Reihenfolge der Zeiochenvorgänge entscheidend ist. Was zuletzt gezeichnet wird ershceint im Gesamtbild "zuoberst".

    Man könnte das ganze auch noch weiter optimieren und den Zustand der Tiles in ein Array speichern um später Probleme beim übereichnen zu vermeiden (wenn du z.B. ein Hintergrundbild verwenden willst funktioniert das so nicht mehr).
    Um beim "Zeichnen", bzw. gedrückt halten des Mauszeigers weiterhin Kacheln zu beeinflussen die von dem Mauszeiger berührt werden müsste man die Funktion mit den Abfragen der WindowMessages ein bisschen abändern. Wenn du willst kann ich das noch für dich machen.

  • Ich glaube das Buffern hab ich verstanden, aber wie funktioniert das mit:

    [autoit]

    GUIRegisterMsg($WM_MOUSEMOVE, "_WM_Proc")
    GUIRegisterMsg($WM_MOUSELEAVE, "_WM_Proc")
    GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_Proc")
    GUIRegisterMsg($WM_RBUTTONDOWN, "_WM_Proc")
    GUIRegisterMsg($WM_PAINT, "_WM_PAINT")

    [/autoit]

    und:

    [autoit]

    Func _WM_Proc($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam, $lParam

    [/autoit]

    wenn du mir erklären könntest wie das Funktioniert wäre das echt nett von dir :)

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Windows verwendet ein Benachrichtigungssystem um die Kommunikation mit Programmen über deren Fenster zu ermöglichen. Wenn du in einem Programm darauf reagierst, dass ein Fenster geschlossen wird, dann reagierst du tatsächlich auf den Eingang einer Nachricht oder WindowMessage namens WM_CLOSE. Jedes Mal wenn die Maus innerhalb eines Fensters bewegt wird, sendet Windows an dein Fenster eine WM_MOUSEMOVE Nachricht die sogar die neuen Koordinaten des Zeigers enthält. WM_L/RBUTTONDOWN werden im Fall des drückens der rechten Maustaste gesendet und WM_MOUSELEAVE falls die Maus das Fenster verlassen sollte.
    WM_MOUSELEAVE ist von den geannnten die einzige Benachrichtigung die vor jedem Verlassen des Fensters ein mal resgistriert werden muss (durch TrackMouseEvent).
    Alle diese WindowMessages können mit der Funktion GUIRegisterMsg registriert werden. Dazu gibt man die ID der Nachricht (z.B. WM_MOUSEMOVE) und eine Funktion an die dafür aufgerufen werden soll.
    GUIRegisterMsg($WM_MOUSEMOVE, "_WM_Proc") ruft für jede Ankunft einer WM_MOUSEMOVE Nachricht (und somit für jede Bewegung des Mauszeigers im Fenster) ein mal die Funktion "_WM_Proc" auf. Jede dieser Nachrichten kann auch noch zusätzliche Informationen liefern (z.B. Mausposition) über die Parameter wParam und lParam. Diese Parameter werden zusammen mit dem Handle des Fensters an die die Nachricht gerichtet ist und deren ID an die Funktion übergeben. Dazu die 4 Parameter in der Funktionsdefinition (hWnd, iMsg, wParam, lParam).
    Informationen über die Nachrichten musst du für gewöhnlich dem Microsoft Developer Network entnehmen, falls es nicht schon jemand mit AutoIt gemacht hat.

  • Ahh so etwas ähnliches habe ich mir schon gedacht :)
    Danke jetzt hab ich das auch verstanden.
    Gibt es eine Liste in der alle msgId's stehen ?
    oder stehen die auf der Seite dessen Link du geschickt hast ?

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !

  • Die wichtigsten stehen im Anhang der Hilfe von AutoIt (findest du bestimmt, da ist nicht viel drin), darauf wird auch im Hilfeartikel zu GUIRegisterMsg verwiesen. Ansonsten findest du auch im MSDN eine Liste. Ein Programm kann sich aber auch beliebig neue Message IDs registrieren.

  • Ich habe jetzt einige msgs gefunden ich habe die hilfe zwar schon vorher angeschaut aber da ist mir
    der "Link" zu den msgs nicht aufgefallen :rolleyes:

    Danke ich glaube das Thema hat sich erledigt

    Ein Spoiler im Spoiler im Spoiler...

    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen
    Spoiler anzeigen

    Die geheime Nachricht ist "Baum" !