我的程序有时会从其他程序启动。如果是这种情况,我希望能够使用WM_COPYDATA在两个程序之间来回发送消息。
我的孩子程序启动后,如何获得调用程序的HWND?是否有我可以调用的功能,或者我可以间接地执行此操作,例如获取调用程序的进程ID,然后从那里转到HWND?
感谢。
答案 0 :(得分:3)
涉及到一个小问题。单个调用程序可以从多个窗口具有多个HWND。不,我担心没有办法获得调用程序的PID或类似的东西。至少在Windows中,无法获得流程的“父”流程。如果不知道调用函数的名称就不能做任何事情,那么你可以查找它的PID并得到它的活动窗口列表。
我建议向后工作,将调用进程的HWND作为命令行参数传递给您的程序。例如“启动YourProgram.exe / hwnd:1234”
编辑:我刚发现有一种方法,但不是由Windows提供的。 http://www.codeproject.com/KB/threads/ParentPID.aspx。但有一点需要注意。 PID会不断生成和回收,因此如果您确实获得了PID,则不会保证其父级不会死(崩溃或已结束的进程),并且其他方式使用PID。然后与假定的父进程进行交互将变得非常危险和不稳定。所以是的,你可以做到。但要小心,如果父进程崩溃,并且您尝试通过其旧的PID访问它,您将遇到重大问题,特别是如果您不小心将某些内容注入到Windows服务主机中。答案 1 :(得分:2)
启动程序发送的第一条消息是否为HWND,以便孩子知道要发送给谁。
答案 2 :(得分:2)
WM_COPYDATA是一种非常悲惨的互操作方式,因为需要找到一个有效的窗口句柄。尽管如此,除非其他程序与您的程序积极合作,否则没有任何用处,否则它会将垃圾中的WM_COPYDATA消息转储。由于该程序已经需要了解很多关于你的程序,包括在何处找到它并处理消息,因此它可能只是为您提供包含所需内容的命令行参数。
是的,窗口句柄可以作为命令行参数传递,您可以从子进程中的main()或GetCommandLine()获取它。
将命名管道或套接字视为更好的捕鼠器。或者是进程外COM。