2012-08-16 45 views
3

我正在与一个不寻常的设计的特殊项目。如何将窗口句柄传递给子进程?

在我的应用程序/过程中,我将创建一个子过程来完成一些工作。在我的过程中,我需要从子流程中获得反馈。我想将我的应用程序/进程的Windows句柄传递给这个子进程,所以我从这个子进程发布消息。

如何将窗口句柄传递给子过程?我的子过程是无窗的用户界面和使用这样的主要功能的命令行应用程序:

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
        LPTSTR lpCmdLine, int nCmdShow) 

我应该通过窗口句柄的主要功能?怎么样?

感谢

+0

带winmain的命令行应用程序?非常不寻常的设计。为什么窗口句柄想要通过? HWND? – Xearinox 2012-08-16 07:29:52

+0

如果你想要HWND。 GetConsoleWindow是你的朋友。 http://msdn.microsoft.com/en-us/library/ms683175%28VS.85%29.aspx – Xearinox 2012-08-16 07:37:21

+1

只需使用命令行参数。将HANDLE转换为DWORD(64位也可以)并从中生成一个字符串。对于这个手柄要小心,没有太多的事情可以用安全的方式进行。像任何需要在wparam或lparam中传递指针的窗口消息一样,这些指针值在其他进程中无效。 – 2012-08-16 11:35:35

回答

10

窗口句柄(HWNDs)是全局性的系统,让您可以只打印句柄作为一个十进制数转换为字符串缓冲区,把它作为对命令的字符串当你用CreateProcess产生你的子进程,并调用_wtoi()或类似的函数将字符串转换回句柄。

+1

如果出于某种原因不想使用命令行参数,则一个(不太优雅的)替代方法就是一个环境变量。 – 2012-08-16 22:12:34

+0

这是记录在MSDN中还是只是一个实现细节? – 2016-07-07 11:01:36

0
  1. 创建一个名为互斥(全球),所以这两个进程可以访问它, 并把它。
  2. 产卵第二个过程。它应该等待互斥锁 被释放。
  3. 然后,您可以使用任何进程间通信方法传递窗口句柄;最简单的可能是Shared Memory。只需将重复的句柄写入共享内存即可。
  4. 释放互斥量,以便第二个进程可以抓住它。
  5. 从共享内存中读取句柄。现在使用它是安全的。

整个互斥操作只是为了确保第二个进程在写入任何内容之前不会从共享内存读取。

(感谢@JonathanPotter征求意见)

+0

窗口句柄不是正常的内核句柄,也不能传递给DuplicateHandle等。它们对系统来说是全局的,对进程来说不是本地的。 – 2012-08-16 08:50:24

+1

@JonathanPotter看起来像你是对的:http://www.codeproject.com/Articles/9110/Inside-Windows-Handles。谢谢,我会编辑答案来匹配。 – Lyth 2012-08-16 12:47:53

相关问题