如何从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文件中查找窗口的最佳方法是什么?
感谢您的阅读:)
答
没有单一的API函数来找到它所属的进程的文件名的窗口。您将不得不手动搜索它。
您可以使用EnumWindows()
来枚举所有顶级窗口,或使用FindWindow()
/FindWindowEx()
查找/枚举特定类型的窗口。
对于每个窗口,您可以:
- 使用
GetWindowThreadProcessId()
得到拥有该窗口的进程ID,然后 - 使用
OpenProcess()
打开HANDLE
到该进程,然后 - 使用
GetModuleFileNameEx()
,GetProcessImageFileName()
或QueryFullProcessImageName()
来查询进程的完整路径和文件名。
或
- 使用
GetWindowModuleFileName()
查询窗口创建它(假设通过由EXE所使用的实际EXE,而不是一个DLL创建的预期窗口的模块的完整路径和文件名)。
一旦你有了窗口的文件名,你就可以将它与你的目标文件名进行比较。
搜索[MSDN](http://msdn.microsoft.com)会告诉您有关以“FindWindow”开头的函数的存在的内容? –
应该可以从正在运行的进程中枚举*所有*打开的窗口,并拥有足够的权限。但是从“exe文件”获取单个窗口是不可能的。 (例如:如果进程打开了多个窗口会怎么样?另外,您确实知道一个程序可以被加载*多次*)这个注释还包含一些提示:关于*运行进程** es ***和关于*枚举*。 –
[这是一篇文章](http://stackoverflow.com/q/6806911/62576),告诉你如何使用WinAPI来做到这一点。它是Delphi代码,但是使用的API调用也可以在C++中使用。 –