是否可以使用 WM_COPYDATA 发送 window 句柄?
Is it possible to send a window handle with WM_COPYDATA?
我正在尝试使用 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 都已设置,并且上面的两种方法 return 0 作为 LRESULT。
我该如何调试?还是有什么根本性的错误?
HWND
不是指针。您很可能想要:
COPYDATASTRUCT cds;
cds.dwData = 20;
cds.cbData = sizeof(HWND);
cds.lpData = &targetWnd;
// ^
LRESULT l = SendMessage(myhWnd, WM_COPYDATA, (WPARAM)nullptr, (LPARAM)&cds);
此外,源和目标 HWND
之间似乎有些混淆,但也许这就是您命名它们的方式。
正如 Jonathan Potter(以及其他一些评论者)所指出的,如果您只想发送 HWND
,还有更有效的方法。
我正在尝试使用 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 都已设置,并且上面的两种方法 return 0 作为 LRESULT。 我该如何调试?还是有什么根本性的错误?
HWND
不是指针。您很可能想要:
COPYDATASTRUCT cds;
cds.dwData = 20;
cds.cbData = sizeof(HWND);
cds.lpData = &targetWnd;
// ^
LRESULT l = SendMessage(myhWnd, WM_COPYDATA, (WPARAM)nullptr, (LPARAM)&cds);
此外,源和目标 HWND
之间似乎有些混淆,但也许这就是您命名它们的方式。
正如 Jonathan Potter(以及其他一些评论者)所指出的,如果您只想发送 HWND
,还有更有效的方法。