RegisterWindowMessage 该函数的参数怎么定义啊???不可以随便写个字符串吧???代码摘录:ControlAtomString:=Format('ControlOfs%.8X%.8X', [GetModuleHandle(nil), GetWindowThreadProcessID(Handle, OwningProcess)]);RM_GetObjectInstance := RegisterWindowMessage(PChar(ControlAtomString));SendMessage(Handle, RM_GetObjectInstance, 0, 0));
问:
1。这段字符串怎么来的呢???? 'ControlOfs%.8X%.8X';
2。RegisterWindowMessage //这个函数的参数怎么确定呢?RegisterWindowMessage(PChar('123456'));像这样可以吗??
2。SendMessage发送给窗体,目标窗体会有这个自定义消息的处理函数吗?????

解决方案 »

  1.   

    可以啊,只不过这样就可以区分不同的进程了,不是吗?不至于两个程序互相干扰了
    目标程序接收到这个消息后,返回Obj的地址,参看
    procedure TWinControl.DefaultHandler(var Message);
    有对应的代码,
      

  2.   

    UINT RegisterWindowMessage(lpsz)
    函数说明:RegisterWindowMessage函数定义一个新的窗口消息,该消息保证在整个系统范围内是唯一的。调用SendMessage或PostMessage函数时可以使用该函数返回的消息值。
                          
    参数说明: lpsz
      指向一个以NULL结束的字符串,该字符串指定待登记的消息。
    返回值:若成功地登记了消息,返回值是一个消息标识符。该标识符值的范围在0XC000到0XFFFF之间,否则,返回值为0。
    注释:RegisterWindowMessage函数通常用于为两个合作应用程序之间的通信登记消息。
      若两个不同的应用程序登记了相同的消息字符串,则这两个应用程序返回相同的消息值。该消息一直维持被登记状态,直到Windows会话结束。当多个应用程序必须处理同一消息时才使用RegisterWindowMessage函数。在一个窗口类范围内发送私有消息时,应用程序可使用范围在WM_USER到0X7FFF之间的任意整数。   1.ControlAtomString:=Format('ControlOfs%.8X%.8X', [GetModuleHandle(nil), GetWindowThreadProcessID(Handle, OwningProcess)]);         ControlOfs%.8X%.8X,是一个Format的表达式,里面的%.8x%.8x好像是8位16进制;
    2.参考上文;
    3.目标窗体要自定义一个处理RM_GetObjectInstance消息的过程;
      

  3.   

    RegisterWindowMessage参数为你的消息名称,比如你定义了一个WM_You,那么就传地这个字符串
    'ControlOfs%.8X%.8X',这个是格式化字符串的,具体你可以查一下format的资料
      

  4.   

    这个消息的应用,参考
    http://topic.csdn.net/u/20110512/18/dff88f50-cb3e-4ee6-9748-e6c50ea3829f.html
      

  5.   


    如果要跨进程的话,FindControl 这个函数是不是有限制呢????在网上看到 FindControl 这个函数只对目标进程为Delphi 或 bcb程序有效。
      

  6.   

    StartPrint := RegisterWindowMessage('WM_PMStartPrint');procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
    begin
      if  (Msg.message = StartPrint) then
      begin
        Memo1.Lines.Add(DateTimeToStr(Now) + ' BroadcastSystemMessage received. wParam:' + IntToStr(Msg.wParam) + ' lParam:' + IntToStr(Msg.lParam));
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      SendMessage(HWND_BROADCAST, StartPrint, Handle, 0);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      PostMessage(HWND_BROADCAST, StartPrint, Handle, 123);
    end;procedure TForm1.WndProc(var Message: TMessage);
    begin
      if Message.Msg = StartPrint then
        Memo1.Lines.Add(DateTimeToStr(Now) + ' Form received. wParam:' + IntToStr(Message.wParam) + ' lParam:' + IntToStr(Message.lParam));
      inherited WndProc(Message);
    end;postmessage :接收 applicationEvent
    sendmessage: 接收 wndproc