qq_29720391 2023-08-04 10:18 采纳率: 50%
浏览 16
已结题

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

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

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

  • 写回答

4条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-04 18:31
    关注

    【以下回答由 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);
    

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

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

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



    【相关推荐】



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

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月11日
  • 创建了问题 8月4日