获取调用程序/被调用程序的 HWND

Posted

技术标签:

【中文标题】获取调用程序/被调用程序的 HWND【英文标题】:Get HWND of calling program / called program 【发布时间】:2010-11-02 21:02:10 【问题描述】:

我的程序有时会从另一个程序启动。如果是这种情况,我希望能够使用 WM_COPYDATA 在两个程序之间来回发送消息。

我的子程序启动后,如何获取调用程序的 HWND?有没有我可以调用的函数,或者我可以间接地做到这一点,例如获取调用程序的进程 ID,然后从它转到 HWND?

谢谢。

【问题讨论】:

【参考方案1】:

涉及一个小问题。一个调用程序可以有来自多个窗口的多个 HWND。不,恐怕没有办法获得调用程序的PID或类似的东西。至少在 Windows 中,无法获得进程的“父”进程。如果不知道调用函数的名称,您将无法进行任何操作,然后您可以查找它的 PID 并获取其活动窗口的列表。

我建议向后工作,将调用进程的 HWND 作为命令行参数传递给您的程序。例如"启动 YourProgram.exe /hwnd:1234"

编辑:我刚刚发现有一种方法,但不是由 Windows 提供的。 http://www.codeproject.com/KB/threads/ParentPID.aspx 。但有一个警告。 PID 会不断生成和回收,因此如果您确实获得了 PID,则无法保证其父级不会死(崩溃或结束的进程)并且 PID 被其他东西使用。然后与假定的父进程交互将变得非常危险和不稳定。所以是的,你可以做到。但是要小心,如果父级崩溃,并且您尝试通过其旧 PID 访问它,您将遇到重大问题,特别是如果您不小心将某些内容注入到 Windows 服务主机中。

【讨论】:

【参考方案2】:

让启动程序发送的第一条消息是它的 HWND,以便孩子知道要发送给谁。

【讨论】:

【参考方案3】:

WM_COPYDATA 是一种非常糟糕的互操作方式,因为需要找到一个有效的窗口句柄。尽管如此,除非其他程序与您的程序积极合作,否则不会发生任何有用的事情,否则它将把 WM_COPYDATA 消息转储到垃圾箱中。由于该程序已经需要了解您的很多信息,包括在哪里找到它和处理消息,它也可能只是为您提供一个包含您需要的命令行参数。

是的,窗口句柄可以作为命令行参数传递,您可以从子进程中的 main() 或 GetCommandLine() 获取它。

将命名管道或套接字视为更好的捕鼠器。或进程外 COM。

【讨论】:

以上是关于获取调用程序/被调用程序的 HWND的主要内容,如果未能解决你的问题,请参考以下文章

c# 调用 win32 API的 SendMessage 函数 ,里面的属性用法?

用ShellExecute调用外部程序出现的程序无法正常打开的错误!

调用 shellexcute 时程序退出

完成处理程序没有被调用为假定的 Swift

python 调用windowsAPI截图

c++ - 分析以获取被调用函数的概述