如何从exe文件的名称查找窗口句柄

问题描述:

想象一下,我有Firefox和我打开Firefox Start Page,然后我应该有一个标题为“Mozilla Firefox Start Page - Mozilla Firefox”的窗口。如何从exe文件的名称查找窗口句柄

我能找到的窗口句柄下面

HWND hwnd = ::FindWindow(0, _T("Mozilla Firefox Start Page - Mozilla Firefox")); 

但我想要的是找到窗口句柄从窗口的EXE文件的名称,比如这个

HWND hwnd = FindWindowFromExe(_T("firefox.exe"));//How to make this function? 

是否Windows API的代码有类似的功能FindWindowFromExe()?如果没有,从exe文件中查找窗口的最佳方法是什么?

感谢您的阅读:)

+0

搜索[MSDN](http://msdn.microsoft.com)会告诉您有关以“FindWindow”开头的函数的存在的内容? –

+0

应该可以从正在运行的进程中枚举*所有*打开的窗口,并拥有足够的权限。但是从“exe文件”获取单个窗口是不可能的。 (例如:如果进程打开了多个窗口会怎么样?另外,您确实知道一个程序可以被加载*多次*)这个注释还包含一些提示:关于*运行进程** es ***和关于*枚举*。 –

+0

[这是一篇文章](http://stackoverflow.com/q/6806911/62576),告诉你如何使用WinAPI来做到这一点。它是Delphi代码,但是使用的API调用也可以在C++中使用。 –

没有单一的API函数来找到它所属的进程的文件名的窗口。您将不得不手动搜索它。

您可以使用EnumWindows()来枚举所有顶级窗口,或使用FindWindow()/FindWindowEx()查找/枚举特定类型的窗口。

对于每个窗口,您可以:

  • 使用GetWindowModuleFileName()查询窗口创建它(假设通过由EXE所使用的实际EXE,而不是一个DLL创建的预期窗口的模块的完整路径和文件名)。

一旦你有了窗口的文件名,你就可以将它与你的目标文件名进行比较。