C++ 进程间传递窗口句柄

  使用系统调用exe的函数和自定义消息的方式 实现两进程通信,但如何直接传递窗口句柄呢?

不想使用Findwindow来实现查找窗口句柄的方式,。

【以下回答由 GPT 生成】

答案:

要实现两个C++进程之间的通信,并直接传递窗口句柄,可以使用进程间通信(IPC)机制来实现。Windows平台上有几种方法可以实现进程间通信,其中一种方法是使用共享内存和事件对象。

以下是一种使用共享内存和事件对象来传递窗口句柄的示例代码:

  1. 首先,创建一个共享内存区域,用于存储窗口句柄。可以使用CreateFileMapping函数来创建共享内存区域。
HANDLE hMapFile = CreateFileMapping(
    INVALID_HANDLE_VALUE,    // 使用页面文件作为物理存储
    NULL,                    // 默认的安全性设置
    PAGE_READWRITE,          // 可读可写权限
    0,                       // 高位DWORD 文件大小
    sizeof(HWND),            // 低位DWORD 文件大小
    _T("MySharedMemory")     // 共享内存区域的名称
);
if (hMapFile == NULL) {
    // 错误处理
    return;
}
  1. 获得共享内存的指针,以便可以将窗口句柄存储在其中。可以使用MapViewOfFile函数来获得指向共享内存的指针。
HWND* pSharedHwnd = (HWND*)MapViewOfFile(
    hMapFile,          // 创建共享内存的句柄
    FILE_MAP_ALL_ACCESS,  // 可读可写权限
    0,
    0,
    sizeof(HWND)
);
if (pSharedHwnd == NULL) {
    // 错误处理
    CloseHandle(hMapFile);
    return;
}
  1. 将窗口句柄存储在共享内存中。
*pSharedHwnd = hwnd;  // 将窗口句柄存储在共享内存中
  1. 创建一个事件对象,以便另一个进程可以等待共享内存被更新。可以使用CreateEvent函数来创建事件对象。
HANDLE hEvent = CreateEvent(
    NULL,   // 默认的安全性设置
    FALSE,  // 自动重置事件
    FALSE,  // 初始状态为非信号状态
    _T("MyEvent")   // 事件对象的名称
);
if (hEvent == NULL) {
    // 错误处理
    CloseHandle(hMapFile);
    UnmapViewOfFile(pSharedHwnd);
    return;
}
  1. 通知另一个进程共享内存已经更新,可以使用SetEvent函数来设置事件对象。
SetEvent(hEvent);  // 通知事件对象

通过以上步骤,第一个进程已经将窗口句柄存储在共享内存中,并通知了另一个进程。

在另一个进程中,可以使用类似的代码来获取共享内存中的窗口句柄,并等待事件对象的通知。代码如下:

HANDLE hMapFile = OpenFileMapping(
    FILE_MAP_ALL_ACCESS,   // 可读可写权限
    FALSE,                 // 默认的安全性设置
    _T("MySharedMemory")   // 共享内存区域的名称
);
if (hMapFile == NULL) {
    // 错误处理
    return;
}

HWND* pSharedHwnd = (HWND*)MapViewOfFile(
    hMapFile,          // 打开共享内存的句柄
    FILE_MAP_ALL_ACCESS,  // 可读可写权限
    0,
    0,
    sizeof(HWND)
);
if (pSharedHwnd == NULL) {
    // 错误处理
    CloseHandle(hMapFile);
    return;
}

HANDLE hEvent = OpenEvent(
    EVENT_ALL_ACCESS,   // 可读可写权限
    FALSE,              // 默认的安全性设置
    _T("MyEvent")       // 事件对象的名称
);
if (hEvent == NULL) {
    // 错误处理
    CloseHandle(hMapFile);
    UnmapViewOfFile(pSharedHwnd);
    return;
}

// 等待事件对象的通知
WaitForSingleObject(hEvent, INFINITE);

// 从共享内存中获取窗口句柄
HWND hwnd = *pSharedHwnd;

// 使用窗口句柄进行进一步的操作
// ...

// 释放资源
CloseHandle(hMapFile);
UnmapViewOfFile(pSharedHwnd);
CloseHandle(hEvent);

通过以上代码,第二个进程可以获取到第一个进程传递过来的窗口句柄,并进行后续的操作。

请注意,以上代码是一种简化版的示例,没有包含完整的错误处理和异常处理机制。在实际应用中,您可能需要根据具体情况进行调整和完善。

希望这些信息能够对你有所帮助。如果你有任何疑问,或需要进一步的帮助,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

SendMessage(WM_COPYDATA)

这个很详细

如何用WM_COPYDATA跨进程传递窗口句柄_是桃萌萌鸭~的博客-CSDN博客 要使用 WM_COPYDATA 跨进程传递窗口句柄, 可以按照以下步骤进行: 在发送方进程中创建一个 COPYDATASTRUCT 结构体,并将要发送的窗口句柄存储在其中。我们首先检查传递的数据大小是否为窗口句柄的大小,以确保正确提取数据。然后我们可以使用传递的窗口句柄来执行任何需要与该窗口交互的操作。 https://blog.csdn.net/qq_55914897/article/details/129900454?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169111581916800182794411%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169111581916800182794411&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-2-129900454-null-null.142^v92^controlT0_1&utm_term=C%2B%2B%20%E8%BF%9B%E7%A8%8B%E9%97%B4%E4%BC%A0%E9%80%92%E7%AA%97%E5%8F%A3%E5%8F%A5%E6%9F%84&spm=1018.2226.3001.4187

img


 机器人回答的共享内存的方式是能够解决进程间通信的需求,但其实整体疑惑是究竟能否用WM_COPYDATA消息来实现传递窗口句柄来相互通信的目的。