Message Maps funktionieren nicht...

kox

Grünschnabel
Hallo,

ich möchte für meine CWnd-Klasse Messages registrieren.
Das mache ich so:

Header-Datei:
Code:
class MyCWnd : public CWnd 
{
public:

	MyCWnd();
    virtual ~MyCWnd();
protected:
    afx_msg void OnKeyDown (UINT nChar, UINT nRepCnt,UINT nFlags);
   DECLARE_MESSAGE_MAP()

};

CPP-Datei
Code:
void MyCWnd::OnKeyDown (UINT nChar, UINT nRepCnt,UINT nFlags)
 {
	unsigned long *volume_pointer;
	unsigned long volume;
	unsigned long new_volume;
	char wavName[]  = "\\windows\\Default.wav";
	CString csName = CString (wavName);
	volume_pointer = &volume;
	waveOutGetVolume(HWAVEOUT WAVE_MAPPER, volume_pointer);
	switch (nChar){
		case 38: {
			if (volume+0x2000 > 0xFFFF) new_volume = 0xFFFF;
			else new_volume = volume+0x2000;
			waveOutSetVolume(HWAVEOUT WAVE_MAPPER,new_volume);
			PlaySound(csName, NULL, SND_SYNC | SND_FILENAME);
			break;
				 }
		case 40: {
			if (volume < 0x2000) new_volume = 0x0000;
			else new_volume = volume-0x2000;
			waveOutSetVolume(HWAVEOUT WAVE_MAPPER,new_volume);
			PlaySound(csName, NULL, SND_SYNC | SND_FILENAME);
			break;
				 }
	
	}
}
BEGIN_MESSAGE_MAP(MyCWnd,CWnd)
	ON_WM_KEYDOWN()
END_MESSAGE_MAP()
Im eigentlichen Programm habe ich dann einen Key-Listener Thread:

Code:
static UINT KeyListener(LPVOID Pparam) {
	
	ThreadRun = true;
	HWND hwnd = (HWND) Pparam;
	CSTUtil su; 
	for (int i=0xc1; i<=0xcf; i++) { 
		su.RegisterHotKey(hwnd, i, i); 
	}
	cwnd.Attach(hwnd); 
	cwnd.SendMessage(WM_KEYDOWN,0,0);
	while (ThreadRun) {
		Sleep(0);
	}
	delete cwnd;
	return 0;

}

Als Ergebnis sollte bei einem Tastendruck die Funktion OnKeyDown ausgeführt werden.
Sieht jemand, warum das nicht passiert?!
Vielen Dank schonmal für evtl. Tipps!

Kox
 
Prüfe mal, ob das Attach in deinem KeyListener funktioniert und nicht FALSE zurückgibt.

Zweitens, was für ein Typ ist cwnd bei dir? Von den Aufrufen her scheint es ein CWnd zu sein, aber das kannst du nicht deleten (Aufruf letzte Zeile im KeyListener).
 
Vielen Dank für deine Antwort.

1. Habs probiert, Attach gibt TRUE zurück.

2. cwnd wird deklariert mit: MyCWnd cwnd;
ist also ein Objekt meiner Klasse MyCWnd, die von CWnd abgeleitet ist.
Aber da das ja eh außerhalb meiner Schleife im Thread ist, dürfte das delete doch
keine entscheidende Rolle bei meinem Problem spielen, oder?

Kox
 
Dann mach mal unser aller Lieblings-Spy auf. Bei VS sollte ein Tool namens Spy oder Spy++ dabei sein. Wenn dein Programm offen ist, dein KeyListener aber noch nicht gestartet, dann aktiviere den Spy, selektiere das Fenster, das auf OnKeyDown reagieren soll und lass dir alle Nachrichten anzeigen.
Starte dann den Thread. Da sollte eigentlich das WM_KEYDOWN zu sehen sein. Wenn ja, dann ist irgendwas an der MessageMap nicht richtig, ansonsten kommt die Nachricht gar nicht erst zu deinem Fenster.

Blöde Frage, du hast aber schon ein MFC-Projekt und den MessageMap-Eintrag vom Assistenten machen lassen? Per Hand geht auch, aber MFC muss es schon sein.

Zu 2) Ja, klar, das delete hat mit deinem Problem nichts zu tun, aber irgendwie finde ich seltsam, dass der Compiler das durchgehen lässt: Du wendest delete auf ein Nicht-Pointer-Objekt an.
 
So ein ähnliches Problem hab ich grad au. Ich möchte nämlich die Zahl, die in nem Edit-Feld steht, verkleinern, wenn man die Pfeilnachunten-Taste drückt.

Wollte au die Methode OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) überschreiben, aber bei mir springt das Programm auch nie rein, egal was ich drück. Mit dem Spy++-Tool konnt ich die Meldung au nie finden, kann das sein dass die vorher abgefangen werden?
 
Endurion hat gesagt.:
Dann mach mal unser aller Lieblings-Spy auf. Bei VS sollte ein Tool namens Spy oder Spy++ dabei sein. Wenn dein Programm offen ist, dein KeyListener aber noch nicht gestartet, dann aktiviere den Spy, selektiere das Fenster, das auf OnKeyDown reagieren soll und lass dir alle Nachrichten anzeigen.
Starte dann den Thread. Da sollte eigentlich das WM_KEYDOWN zu sehen sein. Wenn ja, dann ist irgendwas an der MessageMap nicht richtig, ansonsten kommt die Nachricht gar nicht erst zu deinem Fenster.

Blöde Frage, du hast aber schon ein MFC-Projekt und den MessageMap-Eintrag vom Assistenten machen lassen? Per Hand geht auch, aber MFC muss es schon sein.
Den Message Map Eintrag hab ich selbst gemacht, aber ist MFC, ja.

Da das eine Applikation für PPC ist, habe ich CESpy probiert.
Aber das zeigt mir komischerweise ÜBERHAUPT keine Messages an, nicht
nur für mein Fenster nicht, sondern generell....

Kox
 
Noch nicht mal, wenn du spasshalber die Meldungen vom Explorer oder PPC-Äquivalent nimmst?
 
Gar nicht, das Message-Symbol ist generell ausgegraut,
und auch für andere Prozesse/Fenster kann ich keine Messages angucken.

Kox
 
Klicke einfach mit der rechten Maustaste auf den Prozess/... und wähle dort Message.
Dann klappts! ;
 
Zurück