我已经创建了一个类,当它将被释放时,它应该向整个应用程序传播一个自定义消息。
我用PostMessage
完成了它并且它只有很少的错误
PostMessage(Application.Handle, UM_MYMESSAGE, 0, 0);
然后我意识到它应该是同步的 - 通过SendMessage
。
SendMessage(Application.Handle, UM_MYMESSAGE, 0, 0);
在我的表单上,我使用TApplicationEvents
组件处理邮件,但只是将SendMessage
切换为PostMessage
并未使其处理邮件
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if Msg.message = UM_MYMESSAGE then
begin
ShowMessage('Ok');
Handled := True;
end;
end;
如果我通过表单句柄但不使用Application.Handle
,它会起作用...
我做错了什么?
答案 0 :(得分:5)
仅对发布到主UI线程消息队列的消息触发postgres
事件。 已发送消息直接转到目标窗口的消息过程,绕过消息队列。这就是为什么您的UTF8
事件处理程序可以使用TApplication(Events).OnMessage
而不是OnMessage
。
要抓住已发送的邮件到PostMessage()
窗口,您需要使用TApplication.HookMainWindow()
代替SendMessage()
,例如:
TApplication
话虽如此,更好的解决方案是使用AllocateHWnd()
创建您自己的私人窗口,您可以发布/发送自定义消息,例如:
TApplication(Events).OnMessage
然后您可以发送/发送消息到procedure TForm1.FormCreate(Sender: TObject);
begin
Application.HookMainWindow(MyAppHook);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Application.UnhookMainWindow(MyAppHook);
end;
function TForm1.MyAppHook(var Message: TMessage): Boolean;
begin
if Message.Msg = UM_MYMESSAGE then
begin
ShowMessage('Ok');
Result := True;
end else
Result := False;
end;
。