要使用 WM_COPYDATA
跨进程传递窗口句柄, 可以按照以下步骤进行:
- 在发送方进程中创建一个
COPYDATASTRUCT
结构体,并将要发送的窗口句柄存储在其中。代码如下:
C++
// hwnd: 要发送的窗口句柄
COPYDATASTRUCT cds;
cds.dwData = 0; // 消息id,可以自定义
cds.cbData = sizeof(HWND);
cds.lpData = &hwnd;
- 使用
SendMessage()
函数将COPYDATASTRUCT
结构体发送到接收方进程。接收方进程需要安装一个消息处理函数来从消息队列中读取并处理此消息。代码如下:
C++
// hwndTarget: 接收方窗口句柄
UINT msg = WM_COPYDATA;
WPARAM wParam = (WPARAM) hwndTarget;
LPARAM lParam = (LPARAM) &cds;
SendMessage(hwndTarget, msg, wParam, lParam);
- 在接收方进程中,通过重载窗口过程函数来获取
WM_COPYDATA
消息并提取传输的数据。代码如下:
C++
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COPYDATA:
PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT) lParam;
if (pcds->cbData == sizeof(HWND))
{
HWND hwndSender = *(HWND*) pcds->lpData;
// 处理传递的窗口句柄
}
break;
// 其他消息处理
}
}
在以上代码中,我们首先检查传递的数据大小是否为窗口句柄的大小,以确保正确提取数据。然后我们可以使用传递的窗口句柄来执行任何需要与该窗口交互的操作。