0

嗨,我的SendMessage.

看起来消息永远不会到达我的表单(我正在使用 Winspector Spy 查看在我的表单中注册了哪些消息),这很奇怪,因为我确信我正在发送到当前表单的正确句柄。

SendMessage 在一个 dll 中,但这不应该与它有任何关系。

//sStr is just an input where i type in the Handler address;  
SendMessage(Integer(sStr),WM_COPYDATA, Integer(Handle),Integer(@copyDataStruct));

SendMessage 每次都返回 0。

在接收端:

procedure WMCopyData(var Msg: TWMCopyData); message WM_CopyData;

procedure TMainForm.WMCopyData(var Msg: TWMCopyData);
var
 s : string;
begin
    s := PChar(Msg.CopyDataStruct.lpData);
    showmessage(s);
 //Send something back
    msg.Result := 2006;
end;

我也尝试过其他消息,例如 WM_CLOSE。有谁知道为什么会失败?我正在使用德尔福 5。

4

3 回答 3

1

问题是你不能

Integer(sStr)

将表示整数(例如'12345')的字符串转换为整数(12345)。

利用

StrToInt(sStr)

反而。

实际上,从技术上讲,字符串只是指向字符串头 + 数据的指针。我猜这Integer(sStr)只是返回那个指针。(或者,实际上,只是将 sStr 视为整数)。

也就是说,你应该做

SendMessage(StrToInt(sStr), WM_COPYDATA, Handle, cardinal(@copyDataStruct));
于 2010-10-06T16:16:40.773 回答
1

SendMessage 定义是

function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall;

更新

对于消息 = wm_copydata:

  • 第一个参数是接收数据的窗口句柄
  • 第三个参数是传递数据的窗口句柄

如果您将第一个参数命名为 sStr,我认为它不是句柄而是字符串。

于 2010-10-06T15:48:57.563 回答
0

我认为问题在于您试图为您的窗口使用名称或其他内容,但这不起作用。

试试这个:

var
  Wnd: HWnd;
begin
  Wnd := GetForegroundWindow(); // Assumes your target window is up front
  // Fill in CopyData structure here.
  SendMessage(Wnd, WM_COPYDATA, SomeWParamValue, Cardinal(@CopyDataStruct));
end;
于 2010-10-07T13:04:23.883 回答