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



想象一下我有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)。

拥有窗口的文件名后,您可以将其与目标文件名进行比较。

最新更新