想象一下我有Firefox,我打开了Firefox开始页面,然后我应该有一个标题的窗口:" Mozilla Firefox开始页面-Mozilla Firefox"。
我可以找到带有下面代码的窗口句柄
HWND hwnd = ::FindWindow(0, _T("Mozilla Firefox Start Page - Mozilla Firefox"));
但是我想要的是从窗口的exe文件的名称中找到窗口hander
HWND hwnd = FindWindowFromExe(_T("firefox.exe"));//How to make this function?
Windows API是否具有像FindwindowFromeXe()这样的函数?如果没有,从exe中找到窗口的最佳方法是什么?
感谢您的阅读:)
没有单个API函数可以通过其拥有过程的文件名来找到一个窗口。您将必须手动搜索它。
您可以使用EnumWindows()
列举所有顶级窗口,或使用FindWindow()
/FindWindowEx()
查找/枚举特定类型的Windows。
对于每个窗口,您都可以:
- 使用
GetWindowThreadProcessId()
获取拥有窗口的过程ID,然后 - 使用
OpenProcess()
向该过程打开HANDLE
,然后 - 使用
GetModuleFileNameEx()
,GetProcessImageFileName()
或QueryFullProcessImageName()
查询其完整路径和文件名的过程。
或
- 使用
GetWindowModuleFileName()
查询创建它的模块的完整路径和文件名查询窗口(假设预期的窗口是由实际的EXE创建的,而不是EXE使用的DLL)。
拥有窗口的文件名后,您可以将其与目标文件名进行比较。