【问题标题】:Problem with SendMessage (Delphi)SendMessage 的问题(Delphi)
【发布时间】:2011-02-24 15:02:56
【问题描述】:

我向外部程序发送消息:

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

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

谢谢

【问题讨论】:

    标签: delphi sendmessage


    【解决方案1】:

    阅读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

    【讨论】:

    • 我有 .但我不清楚。我需要一个实际的例子。
    • 这对输入没有帮助。输入是特殊的。
    • @O.D.这很好,但它并没有解决关于伪造输入的问题。
    • 它也应该在WM_APP 范围内,而且您还没有处理跨进程边界的数据编组问题。
    • @David,被问到的问题不是伪造输入。问题询问如何处理消息。
    【解决方案2】:

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

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

    显然,您可以将“消息”替换为某个字符串,该字符串在两个程序中都是常量(发送的和接收的)。

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

    在接收程序中,

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多