SendMessage(Delphi)的问题

时间:2011-02-23 14:49:54

标签: delphi sendmessage

我向外部程序发送消息:

SendMessage(Handle, WM_CHAR, Ord('A'), 0);

但我不知道如何在另一个程序中收到此消息? (有WndProc或类似的东西)可能有人会为我解释一下吗?

谢谢

2 个答案:

答案 0 :(得分:2)

阅读How to send and handle a custom Windows message

未经测试的代码:

const

  WM_REFRESHSOMETHING = WM_USER + 6;

在应该捕获消息的表单上,您需要以下内容:

...
procedure WMRefreshsomething(var ppbMsg : TMessage); message WM_REFRESHSOMETHING;
...

procedure YourForm.WMRefreshsomething(var ppbMsg : TMessage);
begin
  //Actions...
end;

然后您可以发送如下消息:

SendMessageToAll(Handle, WM_REFRESHSOMETHING, 0, 0);

给所有有WM_REFRESHSOMETHING消息的表格;

请参见此可编辑Example

答案 1 :(得分:2)

我在一系列程序中使用以下代码;一个程序启动程序,当每个程序完成时,它们会向启动器发送一条消息,告知它们已完成。该程序的关键是使用HWND_BROADCAST参数:消息被发送到计算机上的所有正在运行的程序,但当然它只由具有正确消息处理程序的人处理。 在必须发送消息的程序中,写

  

SendMessage(HWND_BROADCAST,RegisterWindowMessage('message'),0,0);

显然,你会用一些字符串替换'message',这是两个程序中的常量(发送的和接收的字符串)。

我不建议使用SendMessage的lparam参数来将数据传递给接收程序;这应该是一个指针,当然程序1中指向数据的指针会指向程序2中的垃圾。可以将一个longint强制转换为指针并发送它,然后必须在接收方取消引用< / p>

在接收程序中,

type
 TWMMYMessage = record
 Msg: Cardinal;   // ( first is the message ID )
 Handle: HWND;    // ( this is the wParam, Handle of sender)
 Info: Longint;   // ( this is lParam, pointer to our data)
 Result: Longint;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 wm_Launcher:= RegisterWindowMessage ('message')  
 // wm_launcher is a private member of TForm
 .
 .
 .
end;

procedure TForm1.DefaultHandler(var Message);
var
 ee: TWMMYMessage;

begin
 with TMessage (Message) do
  begin
   if (Msg = wm_Launcher) then
    begin
     ee.Msg:= Msg;
     ee.Handle:= wParam;
     ee.Info:= lParam;
     // Checking if this message is not from us
     if ee.Handle <> Handle then WmMyMessage(ee);
    end
   else inherited DefaultHandler(Message);
  end;
end;

procedure TForm1.WmMyMessage(var Msg: TWMMYMessage);
begin
 startbtnclick (nil)   // here we actually do something when the message is received
end;