Windows Nachrichten abfangen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: Windows Nachrichten abfangen

BeitragMo, Aug 02, 2010 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Aug 02, 2010 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Aug 02, 2010 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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-X

Betreff: ......

BeitragMo, Aug 02, 2010 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 03, 2010 10:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 03, 2010 10:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine geschwungene Klammerzu("}") zu viel Wink
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

BeitragDi, Aug 03, 2010 10:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 03, 2010 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 03, 2010 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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-X

Betreff: ....

BeitragDi, Aug 03, 2010 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Aug 04, 2010 0:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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-X

Betreff: ......

BeitragMi, Aug 04, 2010 9:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Aug 04, 2010 10:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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))

wndproc(hWnd, uMsg, wParam, lParam)


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-X

Betreff: ......

BeitragMi, Aug 04, 2010 11:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Aug 04, 2010 11:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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-X

Betreff: ......

BeitragMi, Aug 04, 2010 12:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group