Windows Nachrichten abfangen
Übersicht

![]() |
Der EisvogelBetreff: Windows Nachrichten abfangen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo
Ich zerbreche mir jetzt schon wieder den ganzen Tag den Kopf, wie man Windows Nachrichten abfangen kann. Ich habe schon unendlich viel gegooglet, aber das was ich gefunden habe hab ich nicht gecheckt. Damals wollte ich das in B3D machen. Da wurde mir gesagt das geht nicht, weil B3D das und das nicht kann. Aber BM kann ja jetzt auch C++. Also muss es ja jetzt irgendwie gehen. Wie geht das denn jetzt? Die Sachen die ich gefunden habe, da wurde immer eine Funktion deklaiert die die Nachrichten verarbeitet, und das sollte dann funktionieren. Aber wie bekommt diese Funktion die Nachrichten? Das wollten die mir nicht dazu schreiben. MfG Der Eisvogel |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielleicht bin ich einfach zu schlecht informiert, aber: Was für Nachrichten meinst du eigentlich? | ||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Windows Messages, sowas wie WM_CLOSE. Das hab ich vergessen zu sagen. Sry. | ||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Suco-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Indem du einem Fenster deine eigene Callback-Funktion zuweist. Schau mal nach der Api Funktion SetWindowCallback.
Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
OK. Also ich bin jezt tein klein wenig schlauer geworden, aber verstehen tue ich es immernoch nicht, denn dieser Code will nicht funktionieren:
Code: [AUSKLAPPEN] #include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); break; } return 0; } } Da sagt BM immer das kann nicht kompiliert werden. Aber keine genaueren Errors. Das ganze ist in einer *.cpp-Datei, die ich mit Import einbinden will. |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eine geschwungene Klammerzu("}") zu viel ![]() Falls das nichts bringt, gehe sicher, dass du g++ mit dem MinGW-Paket installiert hast. mfg Thunder |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab MinGW vergessen gehabt. Uff, wie oft hab ich das jetzt schon installiert.
Aber jetzt bekomme ich ne ganze Menge Errors mit denen ich nix anfangen kann: Code: [AUSKLAPPEN] C:/Program Files (x86)/BlitzMax/mod/eisvogel.mod/systray.mod/systray.cpp:1: error: stray '\239' in program
C:/Program Files (x86)/BlitzMax/mod/eisvogel.mod/systray.mod/systray.cpp:1: error: stray '\191' in program C:/Program Files (x86)/BlitzMax/mod/eisvogel.mod/systray.mod/systray.cpp:1: error: invalid token C:/Program Files (x86)/BlitzMax/mod/eisvogel.mod/systray.mod/systray.cpp:1: error: expected constructor, destructor, or type conversion before '<' token Build Error: failed to compile C:/Program Files (x86)/BlitzMax/mod/eisvogel.mod/systray.mod/systray.cpp |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du hast anscheinend falsche ASCII-Zeichen in deinen C-Source gekriegt. Öffne die Datei Mal mit einem Hex-Editor und suche nach den ASCII-Zeichen 191 bzw. 239. -> http://gcc.gnu.org/ml/gcc-help...00272.html
Außerdem könntest du deinen "C++-Code" in einer C-Datei abspeichern, da er kein einziges, richtiges C++-Element enthält. mfg Thunder |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, passiert jetzt gehts, also es kommen keine Errors mehr. Aber was muss ich jetzt machen? Ich habe jetzt die Funktion, und jetzt? | ||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Suco-XBetreff: .... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kannst du doch wie gesagt auch mit BlitzMax Code machen.
Beispiel: Code: [AUSKLAPPEN] Strict Graphics 800,600,0 local hwnd:int = GetActiveWindow() Function Proc:Int(hwnd:Int , msg:Int , wparam:Int , lparam:Int)"Win32" Select msg Case WM_CLOSE Print "ENDE" End Case WM_MOVE Print "MOVE" Case WM_KEYDOWN Print "KEY: "+wparam Default Return DefWindowProcA(hwnd , msg , wparam , lparam) End Select Return 0 End Function SetWindowLongA(hwnd, GWL_WNDPROC, Int(Byte Ptr(Proc))) Repeat Cls If KeyHit(KEY_ESCAPE) End EndIf Flip Forever damit übernimmst du z.b. die Kontrolle über das Aktuell geöffnete Grafikfenster. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Suco-X
Das ist ja mal cool. Aber ich habe die Zeile mit dem SetWindowLong noch nie gesehen. Ich hab noch nirgends gelesen, dass ich das machen muss. Könntest du mir mal eine Quelle nennen wo das steht? EDIT: Und was macht das "Win32" hinter der Funktion? Wenn ich das weglasse geht es auch. Hat es dennoch einen Sinn? |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Suco-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi.
Mit SetWindowLong kannst du halt Eigentschaften des Fensters ändern. In diesem Fall wird die Funktion ersetzt, die für das verarbeiten der Nachrichten zuständig ist. Optimalerweise würdest du zuvor natürlich noch die Funktion, die BMX oder sonstiges Fenster verwendet, mit GetWindowLong zwischenspeichern und in deiner eigenen Funktion nochmal extra aufrufen. Denn wenn du genauer hinschaust, reagiert das Fenster nicht mehr auf die Nachrichten, die BMX Standardmäßig verarbeitet, da du ja deine eigene Funktion hinzugefügt hast und die andere damit nutzlos im Speicher rumschwirrt. Sollte auch nur ein schubs in die richtige Richtung sein. Ohne das "Win32" sollte das Programm eigentlich abstürzen (Tut es hier z.b.). Das ist für die Verarbeitung der Parameter beim Aufruf einer Funktion zuständig, die WinAPI verarbeitet das anders als BlitzMax mit seinen Funktionen. Quelle ist msdn und das anschauen von vielen Beispielen. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie genau geht das mit dem zwischenspeichern?
Folgendes geht nicht: BlitzMax: [AUSKLAPPEN] Global wndproc:Int(hWnd:Int, uMsg:Int, wParam:Int, lParam:Int) = Byte Ptr(GetWindowLongA(hWnd, GWL_WNDPROC)) Für diesen Code bekomme ich als Dankeschön zwei WAV's |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Suco-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier das Beispiel zum aufrufen deiner eigenen + der BMX eigenen Callback Funktion.
Code: [AUSKLAPPEN] Strict Extern "Win32" Function GetWindow(hwnd:Int, sub:Int) End Extern Graphics 800 , 600 , 0 Local hwnd:Int = GetActiveWindow() Global ProcOld:Int Function Proc:Int(hwnd:Int , msg:Int , wparam:Int , lparam:Int)"Win32" CallWindowProcA(Byte Ptr(ProcOld) , hwnd , msg , wparam , lparam) Select msg Case WM_CLOSE Print "ENDE" End Case WM_MOVE Print "MOVE" Case WM_KEYDOWN Print "KEY: "+wparam Default Return DefWindowProcA(hwnd , msg , wparam , lparam) End Select Return 0 End Function ProcOld = GetWindowLongA(hwnd, GWL_WNDPROC) SetWindowLongA(hwnd, GWL_WNDPROC, Int(Byte Ptr(Proc))) Repeat Cls If KeyHit(KEY_ESCAPE) Print "END FROM BMX" End EndIf Flip Forever Im Prinzip speicherst du die Adresse der Funktion mit GetWindowLongA in einem 32 Bit Integer Wert und beim Aufruf deiner eigenen Callback Funktion schleust du die Funktion mit CallWindowProcA ein. So funktioniert auch wieder die Escape-Taste zum beenden des Programms. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
OK, dann war hier der Schlüssel das CallWindowProc. Danke
So wie es im Moment ist, werden ja aber die Nachrichten sowohl von BM selbst verarbeitet und von mir oder? Wenn ich das nicht will, dann setze ich einfach das CallWindowProc hinter das Default, oder? |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Suco-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also es gibt mehrere Optionen. Willst du dass das gewünschte Fenster keine Nachrichten verarbeitet, knall deine Funktion rein und lass die Funktion des Fensters in den ewigen des Speichers zurück. Willst du dass das Fenster zuerst die Nachrichten verarbeitet und dann du, so nehme meinen Beispielcode von oben.
Kannst du persönlich mit einer Nachricht nichts anfangen aber die Standard-Funktion vom Fenster soll darauf reagieren, so setze das CallWindowProc vor Return DefWindowProcA(hwnd , msg , wparam , lparam). DefWindowProcA ruft übrigens nur eine Windows-Standardfunktion auf, die alle vom Programm nichtbenötigten Nachrichten verarbeitet. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group