如何从 exe 文件名中找到 window 句柄
How to find window handle from exe file's name
假设我有 Firefox,我打开 Firefox 起始页,那么我应该有一个 Window,标题为:"Mozilla Firefox Start Page - Mozilla Firefox"。
我可以用下面的代码找到 window 句柄
HWND hwnd = ::FindWindow(0, _T("Mozilla Firefox Start Page - Mozilla Firefox"));
但我想要的是从 window 的 exe 文件名中找到 window 句柄
HWND hwnd = FindWindowFromExe(_T("firefox.exe"));//How to make this function?
windowsApi有没有类似FindWindowFromExe()的函数?如果没有,从其 exe 中查找 window 的最佳方法是什么?
感谢阅读:)
没有一个 API 函数可以通过其所属进程的文件名查找 window。您将不得不手动搜索它。
您可以使用 EnumWindows()
to enumerate all top-level windows, or use FindWindow()
/FindWindowEx()
到 find/enumerate 特定类型的 windows。
对于每个 window,您可以:
- 使用
GetWindowThreadProcessId()
获取拥有window的进程ID,然后
- 使用
OpenProcess()
打开一个HANDLE
那个进程,然后
- 使用
GetModuleFileNameEx()
, GetProcessImageFileName()
, or QueryFullProcessImageName()
查询进程的完整路径和文件名。
或
- 使用
GetWindowModuleFileName()
查询 window 以获取创建它的模块的完整路径和文件名(假设预期的 window 是由实际的 EXE 而不是 DLL 创建的由 EXE 使用)。
获得 window 的文件名后,您可以将其与目标文件名进行比较。
假设我有 Firefox,我打开 Firefox 起始页,那么我应该有一个 Window,标题为:"Mozilla Firefox Start Page - Mozilla Firefox"。
我可以用下面的代码找到 window 句柄
HWND hwnd = ::FindWindow(0, _T("Mozilla Firefox Start Page - Mozilla Firefox"));
但我想要的是从 window 的 exe 文件名中找到 window 句柄
HWND hwnd = FindWindowFromExe(_T("firefox.exe"));//How to make this function?
windowsApi有没有类似FindWindowFromExe()的函数?如果没有,从其 exe 中查找 window 的最佳方法是什么?
感谢阅读:)
没有一个 API 函数可以通过其所属进程的文件名查找 window。您将不得不手动搜索它。
您可以使用 EnumWindows()
to enumerate all top-level windows, or use FindWindow()
/FindWindowEx()
到 find/enumerate 特定类型的 windows。
对于每个 window,您可以:
- 使用
GetWindowThreadProcessId()
获取拥有window的进程ID,然后 - 使用
OpenProcess()
打开一个HANDLE
那个进程,然后 - 使用
GetModuleFileNameEx()
,GetProcessImageFileName()
, orQueryFullProcessImageName()
查询进程的完整路径和文件名。
或
- 使用
GetWindowModuleFileName()
查询 window 以获取创建它的模块的完整路径和文件名(假设预期的 window 是由实际的 EXE 而不是 DLL 创建的由 EXE 使用)。
获得 window 的文件名后,您可以将其与目标文件名进行比较。