【问题标题】:Is it possible to send a window handle with WM_COPYDATA?是否可以使用 WM_COPYDATA 发送窗口句柄?
【发布时间】:2021-08-21 00:20:51
【问题描述】:

我正在尝试使用 WM_COPYDATA IPC 方法发送 HWND。 到目前为止,当发送一个字符串 LPCTSTR 时它可以工作。

LPCTSTR str = L"Test";
COPYDATASTRUCT cds;
cds.dwData = 20;
cds.cbData = sizeof(TCHAR) * wcslen(str);
cds.lpData = (PVOID)str;
LRESULT l = SendMessage(myhWnd, WM_COPYDATA, (WPARAM)nullptr, (LPARAM)&cds);

但是当使用 HWND 时,消息甚至没有到达......

COPYDATASTRUCT cds;
cds.dwData = 20;
cds.cbData = sizeof(HWND);
cds.lpData = (PVOID)targetWnd;
LRESULT l = SendMessage(myhWnd, WM_COPYDATA, (WPARAM)nullptr, (LPARAM)&cds);

PVOID 应该能够指向任何 afaik。

我的 HWND 都已设置,并且上述两种方法都返回 0 作为 LRESULT。 我该如何调试?还是有什么根本错误?

【问题讨论】:

  • 除非您还要发送其他数据,否则WM_COPYDATA 发送 HWND 太过分了;您可以将其作为任何自定义消息的wParamlParam 参数发送。
  • 我不知道任何其他类型的 IPC,除了 WM_COPYDATA 用于同步状态和一些变量等小事。如果有更好的方法我很想学习。@JonathanPotter
  • 哦,WM_USER+x 的东西。好的。但为什么这是矫枉过正?不一样吗?
  • 没有。发送自定义消息没有跨进程的系统封送内存(如WM_COPYDATA)。 SendMessage(target, MY_MESSAGE, 0, (LPARAM)hwnd) 将简单地复制 wParamlParam 值。虽然你不想要WM_USER 消息。如果您想让消息成为公共 API 的一部分,请改用 WM_APP 消息或注册消息。
  • "到目前为止,当发送一个字符串 LPCTSTR 时它可以工作" - 实际上,它没有,因为您将 cds.cbData 设置为错误的值。您需要将其设置为 lstrlen(str) * sizeof(*str) 而不是 sizeof(LPCTSTR)

标签: c++ c winapi ipc wm-copydata


【解决方案1】:

HWND 不是指针。您很可能想要:

COPYDATASTRUCT cds;
cds.dwData = 20;
cds.cbData = sizeof(HWND);
cds.lpData = &targetWnd;
//           ^
LRESULT l = SendMessage(myhWnd, WM_COPYDATA, (WPARAM)nullptr, (LPARAM)&cds);

此外,来源和目标HWNDs 之间似乎有些混淆,但也许这正是您命名它们的方式。

正如 Jonathan Potter(和其他一些评论者)指出的那样,如果您只想这样做,还有更有效的方法可以发送 HWND

【讨论】:

  • 发送hwnd的值应该没问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多