Delphi:SendMessage不发送到FMX

SAM*_*Pro 0 windows delphi firemonkey

我成功发送消息跨应用程序.但是代码在FMX中不起作用.我可以找到FMX表单,但在dest没有收到消息.

发件人代码:

  CDS.dwData:= 0;   //Identify message
  CDS.cbData:= ByteLength(Str);
  CDS.lpData:= PChar(Str);

  if DstHandle=0 then
    DstHandle := Winapi.Windows.FindWindow(nil, PChar(TargetFormCaption));

  if DstHandle<>0 then
  begin
    Res := SendMessage(DstHandle, WM_COPYDATA, Handle, NativeInt(@CDS));
    Result:= True;
  end
  else
    Result:= False;
Run Code Online (Sandbox Code Playgroud)

结果为true但未WMGetData触发.接收者代码:

procedure WMGetData(var Msg : TWMCopyData) ; message WM_COPYDATA;
...
procedure TForm3.WMGetData(var Msg: TWMCopyData);
begin
  Caption:= 'Got something !';
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 7

FMX中的表单无法以与VCL表单相同的方式接收消息.FMX不会调度FMX不使用的窗口消息.

解决此问题的干净方法是使用AllocateHWnd创建可以接收消息的窗口.即使对于VCL应用程序来说这也是正确的方法,因为这样的窗口不会重新创建.

  • 另一种选择是在FMX看到之前将Form的HWND子类化为拦截消息:http://stackoverflow.com/a/9186663/65863 (2认同)