利用COPYDATA消息传递窗口句柄

WM_COPYDATA消息在进程间传递的窗口HWND不起作用,无法利用这个传递的HWND发送目标窗口消息,请问是怎么回事。

  子进程:
        HWND hwnd = ::FindWindow(NULL,"ExeTest1");
        COPYDATASTRUCT cds;
       cds.dwData = 20; // 消息id,可以自定义
    cds.cbData = sizeof(HWND);
    cds.lpData = &this->m_hWnd;
    ::SendMessage(hwnd,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds);
主进程:WM_COPYDATE消息响应
        HWND hwndSender;
    hwndSender = (HWND)pCopyDataStruct->lpData;

DATA不是DATE

【以下回答由 GPT 生成】

问题的根本原因是在不同进程间传递窗口句柄(HWND)是不可行的,因为窗口句柄是进程内部的资源,不同进程之间的窗口句柄是不相通的。因此,你无法直接在子进程中使用WM_COPYDATA消息发送一个窗口句柄给主进程。

要解决这个问题,你可以考虑以下几种方法:

  1. 使用其他通信机制:考虑使用进程间通信(IPC)机制,例如使用命名管道(Named Pipe)或共享内存(Shared Memory)来传递消息或数据。这些机制可以在不同进程之间进行通信,而不需要传递窗口句柄。

  2. 使用窗口消息传递其他信息:如果你需要在子进程和主进程之间传递一些其他的信息,而不仅仅是窗口句柄,你可以将这些信息封装在CD COPYDATASTRUCT 的lpData字段中,例如传递一个结构体或一个指向结构体的指针,并在接收方将其解析出来。但需要注意,这种方法只能传递数据,而无法传递操作或事件。

  3. 共享资源:如果你需要在子进程和主进程之间共享某些资源,例如共享内存或文件,你可以将需要共享的数据保存在共享资源中,然后在进程间进行读写操作。但需要特别注意的是,对共享资源的读写需要进行同步,以避免竞争条件和数据冲突。

如果以上方法都不能满足你的需求,可能需要重新考虑你的应用架构,是否真正需要在不同进程间传递窗口句柄,或者是否可以通过其他方式实现你的功能。

总结起来,解决这个问题的关键是要认识到进程间的窗口句柄是不可传递的,而需要选择其他适合的通信方式来实现你的需求。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
  1. gpt的回答基本是正确的,很佩服大模型的分析能力和对技术问题的理解。
  2. 通过句柄访问的方案与通过指针访问是非常不同的,句柄方案的安全性是经过广泛验证的,经过Windows3.1到目前二十几年的完善与迭代、基本上应该没有大的漏洞。
  3. 你想实现的功能,可能需要研究DDE、OLE、COM有关的技术实现与迭代、才能够找到合理答案。