【问题标题】:Why I cannot find window?为什么我找不到窗口?
【发布时间】:2017-11-14 14:35:20
【问题描述】:

我使用this 示例在两个应用程序之间发送字符串。

当我第一次按下发送按钮时,字符串被发送到接收器,但只接收到部分字符串。

当我第二次按下发送按钮时,我得到“找不到窗口!”。 窗口就在屏幕上。为什么我第一次按下按钮就可以,第二次就不行了?


这是发件人:

procedure TfrmSender.SendString;
var
 stringToSend : string;
 copyDataStruct : TCopyDataStruct;
begin
 Caption:= 'Sending';
 stringToSend := 'About - Delphi - Programming';

 copyDataStruct.dwData := 12821676; //use it to identify the message contents
 copyDataStruct.cbData := 1 + Length(stringToSend) ;
 copyDataStruct.lpData := PChar(stringToSend);

 SendData(copyDataStruct) ;
end;



procedure TfrmSender.SendData(CONST copyDataStruct: TCopyDataStruct);
VAR
   receiverHandle : THandle;
   res : integer;
begin
 receiverHandle := FindWindow(PChar('TfrmReceiver'), PChar('frmReceiver')) ;
 if receiverHandle = 0 then
  begin
   Caption:= 'Receiver window NOT found!';
   EXIT;
  end;

 res:= SendMessage(receiverHandle, WM_COPYDATA, Integer(Handle), Integer(@copyDataStruct));
 if res= 0 then Caption:= 'Receiver window found but msg not hand';
end;

这是接收者:

procedure TfrmReceiver.WMCopyData(var Msg: TWMCopyData);
VAR
   s : string;
begin
 if Msg.CopyDataStruct.dwData = 12821676 then
  begin
   s := PChar(Msg.CopyDataStruct.lpData);
   msg.Result := 2006;  //Send something back

   Winapi.Windows.Beep(800, 300);
   Caption:= s;
  end
end;

【问题讨论】:

  • 项目:ufile.io/1pyr5
  • @RBA - 不。无关。使用管道。我使用 WM_COPYDATA
  • 第二次尝试失败的原因是因为您正在更改 Windows 标题。 FindWindiow 的第二个参数是标题。
  • 这是 64 位的吗? Integer(@copyDataStruct) 是一个常见的陷阱。
  • cbData 是以字节为单位的大小。您将其设置为字符串的长度。 Delphi 2009 及更高版本使用WideChar 字符。

标签: api delphi sendmessage findwindow wm-copydata


【解决方案1】:

总结一下cmets有两个错误

1)(见@Tom Brunberg)是长度设置不正确,这就是为什么你只得到部分(大约一半?字符串)

应该是

copyDataStruct.cbData := sizeof( Char )*(Length(stringToSend) + 1 );

2) 表单标题正在更改,导致表达式无效

FindWindow(PChar('TfrmReceiver'), PChar('frmReceiver'))

因为第二个参数是表单的标题(在 Delphi 术语中)

【讨论】:

  • 谢谢。 PS:我使用 stringToSend := pchar('About - Delphi - Programming') 以避免对空字符(2+)进行硬编码。
  • 我更喜欢:copyDataStruct.cbData := SizeOf(Char)*(Length(stringToSend) + 1));.
  • @RudyVelthuis 我同意 - 我会改变。我们允许 null,它是 SizeOf(Char) 长,不管 char 的大小。
猜你喜欢
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
相关资源
最近更新 更多