我使用一个Application.OnMessage事件处理程序来处理程序中其他线程发送的消息(通知)。但是当弹出菜单处于激活状态(打开)时,这个事件处理程序不会被调用。以下是测试代码(没有线程,但原理相同):
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := ApplicationEvents1Message;
end;
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if Msg.message = WM_USER then
Beep();
end;
procedure TForm1.tmr1Timer(Sender: TObject);
begin
PostThreadMessage(GetCurrentThreadId, WM_USER, 0, 0);
end;
MsgWaitForMultipleObjects(0, PHandle(nil)^, False, INFINITE, QS_POSTMESSAGE)
。它接收由 PostThreadMessage 发送的任何消息,因为模态仅影响主线程。然后,它与主线程同步没有问题,因为同步不受主线程模态状态的影响。 - Sertac Akyuz