SendMessage到Application.Handle无法正常工作

时间:2018-04-16 17:15:00

标签: delphi sendmessage postmessage

我已经创建了一个类,当它将被释放时,它应该向整个应用程序传播一个自定义消息。 我用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,它会起作用... 我做错了什么?

1 个答案:

答案 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;