为什么我找不到 window?
Why I cannot find window?
我使用 this 示例在两个应用程序之间发送字符串。
当我第一次按下发送按钮时,字符串被发送到接收器,但只收到了字符串的一部分。
当我第二次按下“发送”按钮时,我得到 "Window not found!"。
window 就在屏幕上。为什么我第一次按下按钮时有效,但第二次按下按钮时无效?
这是发件人:
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;
总结评论有两个错误
1)(见@Tom Brunberg)是长度设置不正确,这就是为什么你只得到部分(大约一半?字符串)
应该是
copyDataStruct.cbData := sizeof( Char )*(Length(stringToSend) + 1 );
2) 正在更改表单标题,这会使表达式无效
FindWindow(PChar('TfrmReceiver'), PChar('frmReceiver'))
因为第二个参数是表单的标题(在 Delphi 术语中)
我使用 this 示例在两个应用程序之间发送字符串。
当我第一次按下发送按钮时,字符串被发送到接收器,但只收到了字符串的一部分。
当我第二次按下“发送”按钮时,我得到 "Window not found!"。 window 就在屏幕上。为什么我第一次按下按钮时有效,但第二次按下按钮时无效?
这是发件人:
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;
总结评论有两个错误
1)(见@Tom Brunberg)是长度设置不正确,这就是为什么你只得到部分(大约一半?字符串)
应该是
copyDataStruct.cbData := sizeof( Char )*(Length(stringToSend) + 1 );
2) 正在更改表单标题,这会使表达式无效
FindWindow(PChar('TfrmReceiver'), PChar('frmReceiver'))
因为第二个参数是表单的标题(在 Delphi 术语中)