Ablaufveränderung durch MessageBox !?
-
Hallo,
ich habe die Frage schon in einem anderen Forum gestellt, jedoch erhalte ich dort keine Antwort mehr.
Mein Problem ist folgendes:
Ich habe einmal unter WM_KEYDOWN: eine MessageBox(); Anweisung und einmal unter WM_CHAR. Die normale "Sendereihenfolge" an Windows sieht ja so aus:
- zuerst WM_KEYDOWN
- danach WM_CHAR
Wenn ich die MessageBox(en) auskommentiere, trifft dies auch zu.
Wenn ich jedoch die MessageBox(en) in die 2-case-Zweige reinschreibe, so verändern sie den Ablauf.
Es erscheint zu erst die MessageBox von WM_CHAR und danach die von WM_KEYDOWN.Könnte mir jmd bitte dieses Phänomen erklären?

-
Etwas Quellcode bitte, sonst müssten wir hellsehen.
-
Erstmal sorry dass ich jetzt erst antworte, jedoch konnte ich die letzten Tage nicht an den PC.
Hier ist ein kleiner Auszug aus meinem Programm:
case WM_KEYDOWN: switch(wParam) { case VK_HOME: xPos = 0; xZaehler1 = xZaehler; xZaehler = 0; SetCaretPos(xPos, yPos); return 0; case VK_END: if (xZaehler > xZaehler1) { xZaehler1 = xZaehler; } xPos = xZaehler1 * cxChar; SetCaretPos(xPos, yPos); return 0; default: //MessageBox(NULL, TEXT("WM_KEYDOWN-DEFAULT"), "FEHLER", MB_ICONERROR); return 0; } return 0; case WM_CHAR: switch(wParam) { default: hdc = GetDC(hwnd); HideCaret(hwnd); //MessageBox(NULL, TEXT("WM_CHAR"), "FEHLER", MB_ICONERROR); pEingaben[n] = (TCHAR) wParam; if (xZaehler <= xMogl) { SELECTOBJ TextOut(hdc, xPos, yPos, &pEingaben[n], 1); DELETEOBJ } else SendMessage(hwnd, WM_CHAR, '\r', 1); ReleaseDC(hwnd, hdc);Das wärs.

-
Mit einem Wort: Windows.

<hypothese>
Wenn man den Code im Debugger durchgeht, sieht man, dass natürlich zuerst WM_KEYDOWN kommt.Der MessageBox-Aufruf ist zwar blockend, die Nachrichten des Hauptfensters werden aber trotzdem weiter verarbeitet. Erkennen kann man das z.B. daran, dass das Fenster immer noch neu gezeichnet wird, wenn man die MessageBox verschiebt.
Ich vermute nun, dass die Nachrichtenwarteschlange des Hauptfensters geleert wird, bevor die MessageBox angezeigt wird. Dadurch kommt TranslateMessage zum Zug und postet ein WM_CHAR. Dieses wird sofort verarbeitet und eine weitere MessageBox soll angezeigt werden. Dieser Aufruf kam zwar nach der WM_KEYDOWN-MessageBox, aber das ist der neuen MessageBox egal. Sie stellt fest, dass die Nachrichtenschleife nach dem WM_CHAR leer ist und zeigt die Meldung an.
Jetzt kann die erste MessageBox natürlich nichts anzeigen, da es ja keine Multithread-Anwendung ist. Die Nachrichtenschleife der ersten MessageBox hängt quasi bei der Funktion VerarbeiteHauptfensterNachrichten(). Wenn die zweite Box geschlossen wird, kommt die erste zum Zuge und kann mit ihrer Nachrichtenschleife fortfahren.
</hypothese>