message queue leersaugen
-
hi,
ich hab' vor jahren mal ne mfc-anwendung geproggt (aber die frage ist hier, glaube ich, besser aufgehoben). und kaum noch plan von winapi usw. also es ist 'n mdi-programm wobei eins der child-windows eine menge buttons enthält. das problem ist nun: die anwendung soll für kurze zeit periodisch (für ca. 3 sekunden) keine mouse-messages bekommen, egal ob einer klickt oder nicht. ich hab's mit EnableWindow(FALSE) probiert, aber die msgs landen in der queue und werden nach dem 'enablen' des fensters abgearbeitet. frage: was ist der beste weg, um die mouse-messages zu 'schlucken'?btw: zur zeit mache ich etwa folgendes
for (;;) { MSG msg; BOOL ret = PeekMessage (&msg, 0,WM_MOUSEFIRST,WM_MOUSELAST, PM_REMOVE); if (ret == FALSE) break; }das klappt zwar, scheint mir aber nicht der tolle weg zu sein. geht es besser/einfacher?
man dankt für alle tips.

-
Ds ist falsch, wenn ein Fenster nicht enabled ist werden keine Eingabenachrichten von Maus und Tastatur abgearbeitet und für ein Fenster empfangen!
-
Martin Richter schrieb:
Ds ist falsch, wenn ein Fenster nicht enabled ist werden keine Eingabenachrichten von Maus und Tastatur abgearbeitet und für ein Fenster empfangen!
was bei mir offenbar nicht zu funktionieren scheint, ich habe versucht, das hauptfenster, die mdi-childs und sogar die einzelnen controls zu disablen. ja du hast recht, *während* sie disabled sind, passiert nix. aber wenn ich einen mausklick in einem disabled-en control mache und es danach wieder enable, reagiert es auf den klick (denn dieser hängt noch irgendwo in der msg-queue).
btw, das programm arbeitet viel mit subclassing und fängt WM_COMMAND ab, etc. vielleicht ist da der wurm drin, dass EnableWindow(FALSE) nicht tut was es soll?

-
1. WM_COMMAND Nachrichten sind keine Maus/Keybord Nachrichten
2. Disable das Main Window und gut ist!
3. Wenn das Verhalten so wäre, wie Du es beschreibst. Würde ein Klick auf ds Fenster unter einem modalen Dialog nach schließen des Dialoges auch ausgefüht werden.Fazit: Du Disablest die falschen Fenster...
-
Martin Richter schrieb:
2. Disable das Main Window und gut ist!
schon probiert. und wie gesagt, die msgs bleiben ge-queued und werden nach dem enablen trotzdem ausgeführt.
Martin Richter schrieb:
3. Wenn das Verhalten so wäre, wie Du es beschreibst. Würde ein Klick auf ds Fenster unter einem modalen Dialog nach schließen des Dialoges auch ausgefüht werden.
das ist ja was ganz anderes.
aber, naja, irgendwo muss etwas drin sein, dass den windowmanager leicht durcheinander bringt. aber was soll's. ich lass es einfach beim peekmessage-hack. der tuts ja auch.
danke für deine hilfe.

-
Martin Richter schrieb:
Fazit: Du Disablest die falschen Fenster...
ich versuchte das: AfxGetMainWnd()->EnableWindow(FALSE);
sowie das: AfxGetApp()->m_pMainWnd->EnableWindow(FALSE);
^^ beides ohne erfolg.
