【问题标题】:How to find window handle from exe file's name如何从exe文件名中查找窗口句柄
【发布时间】: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


【解决方案1】:

没有单一的 API 函数可以通过其拥有进程的文件名来查找窗口。您必须手动搜索它。

您可以使用EnumWindows() 枚举所有顶级窗口,或使用FindWindow()/FindWindowEx() 查找/枚举特定类型的窗口。

对于每个窗口,您可以:

  • 使用GetWindowModuleFileName() 在窗口中查询创建它的模块的完整路径和文件名(假设预期窗口是由实际的 EXE 而不是 EXE 使用的 DLL 创建的)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多