代码之家  ›  专栏  ›  技术社区  ›  IceCold

为什么我找不到窗户?

  •  -1
  • IceCold  · 技术社区  · 7 年前

    我使用 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;
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Dsm    7 年前

    总结这些评论有两个错误

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

    应该是这样的

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

    2) 表单标题正在更改,这将使表达式无效

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

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