【发布时间】:2017-05-08 16:56:29
【问题描述】:
假设我有 Firefox,我打开 Firefox 起始页,然后我应该有一个标题为“Mozilla Firefox 起始页 - Mozilla Firefox”的窗口。
我可以用下面的代码找到窗口句柄
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 中查找窗口的最佳方法是什么?
感谢阅读:)
【问题讨论】:
-
搜索MSDN会告诉你什么以
FindWindow开头的函数的存在? -
应该可以从正在运行的进程中枚举所有个打开的窗口,并且具有足够的权限。但是从“exe 文件”中只获取一个窗口是不可能的。 (恰当的例子:如果进程打开了多个窗口怎么办?另外,你知道一个程序可以加载 multiple 次吗?)这个评论还包含一些提示:关于 running process es 以及关于枚举。
-
Here is a post 向您展示了如何使用 WinAPI 执行此操作。它是 Delphi 代码,但使用的 API 调用也适用于 C++。
-
@Some程序员老兄:不用担心可以用一个exe文件打开多个窗口-因为可以有多个窗口具有相同的标题名称,例如:“无标题-记事本”,我已经测试过使用 ::FindWindow(0, _T("Untitled - Notepad")); ,它得到顶层窗口。无论如何,我已经阅读了理想的获取所有窗口进程并比较名称,但我想知道窗口 api 支持是否从 exe 名称中获取。
-
@RbMm:运行的窗口通常比进程线程少,因此直接枚举正在运行的窗口并解析它们的进程名称通常会比枚举所有进程和所有进程更快且开销更少他们的线程和他们所有的窗口。
标签: c++ winapi window-handles