Warum wird Application.OnMessage nicht aufgerufen, wenn das Popup-Menü angezeigt wird?

8

Ich verwende einen Application.OnMessage-Ereignishandler, um Nachrichten (Benachrichtigungen) von anderen Threads in meinem Programm zu verarbeiten. Und ich habe festgestellt, dass dieser Event-Handler nicht aufgerufen wird, wenn das Popup-Menü aktiv (geöffnet) ist. Der Testcode ist unten (es ist ohne Threads, aber das Prinzip ist das gleiche):

%Vor%     
Dmitro25 26.10.2016, 05:55
quelle

1 Antwort

8

OnMessage wird von der Nachrichtenschleife des Haupt-Threads aufgerufen. Diese Nachrichtenschleife ist in Delphis VCL-Bibliothekscode implementiert. Daher hat dieser Bibliothekscode die Möglichkeit, den Ereignishandler für OnMessage aufzurufen.

Das Popup-Menü wird durch Aufruf der Win32-Funktion TrackPopupMenuEx angezeigt. Diese Funktion implementiert eine modale Nachrichtenschleife, um die Überwachungsbenutzeroberfläche für das Menü auszuführen. Da diese Nachrichtenschleife in Win32-Code implementiert ist, verfügt der VCL-Code nicht über die Möglichkeit, das Ereignis OnMessage auszulösen. Der Win32-Code kennt die VCL nicht und führt eine einfache Nachrichtenschleife aus. Nachrichten werden bearbeitet und versendet, aber kein VCL-spezifischer Code kann ausgeführt werden.

Dies ist ein perfektes Beispiel dafür, warum PostThreadMessage vermieden werden sollte. Nur wenn Sie jede Nachrichtenschleife kontrollieren, kann sie verwendet werden. Andere Fehlerpunkte umfassen Systemmeldungsdialoge, modale Schleifen mit Ziehen und Ablegen, modale Schleifen mit Fensterbewegung / -größe.

Sie sollten aufhören, PostThreadMesaage zu verwenden. Erstellen Sie stattdessen ein Fensterhandle im Hauptthread mit AllocateHWnd . Senden Sie Nachrichten von den Arbeitsthreads an dieses Fenster.

    
David Heffernan 26.10.2016 06:14
quelle

Tags und Links