【问题标题】:C++ FindWindow to find current windowC++ FindWindow 查找当前窗口
【发布时间】:2015-07-14 14:02:04
【问题描述】:

我有一个程序可以在 Windows 8.1 上打开一个窗口(实际上是一个视频游戏)。然后,该程序以我编译的 C++ .DLL 的形式调用“扩展”。在该 DLL 中,我需要获取调用 DLL 的程序(视频游戏)窗口的句柄。我可以使用 FindWindow 命令结合视频游戏窗口的名称来执行此操作。但是,有时我需要一次打开它的 2 个副本,两者都具有相同的窗口名称。这意味着使用 FindWindow(windowName) 不能保证选择我真正想要的窗口。有没有办法获得与调用 C++ 代码的应用程序相同的窗口的句柄,而无需指定名称?

【问题讨论】:

  • 为什么不能只将窗口句柄传递给游戏中的 dll?
  • 帖子标题混乱
  • 是的,对那里的标题感到抱歉。应该先有证据阅读。我无法从游戏内部将窗口句柄传递给 DLL,因为游戏使用了一种特殊的脚本语言,它可以调用外部 DLL 中的函数,但不能从游戏脚本本身内部调用任何标准语言代码。
  • @Jordan 脚本语言是否以任何不透明的方式(不调用 WinAPI)提供对窗口句柄的访问,例如 Qt 吗?如果是这样,您可以将其作为void* 传递并将其转换为HWND。如果没有,脚本语言也有可能在应用程序的事件循环内执行 - 如果是这样,您可以尝试在 DLL 中调用 GetActiveWindow() msdn.microsoft.com/en-us/library/windows/desktop/…,如果从消息循环中调用它会得到你的窗口:)

标签: c++ windows dll findwindow


【解决方案1】:

对于您从EnumWindow 获得的与windowName 匹配的每个窗口,您可以检查HWND's 进程并选择一个属于您正在运行的进程的窗口。这可以使用GetWindowThreadProcessId 函数来完成 - 它将为您提供窗口所属进程的 PID,您可以将其与 GetCurrentProcessId 中的您自己的 PID 进行比较。

【讨论】:

  • 如何使用FindWindow() 获得多个结果?
  • 确实,我显然是指 EnumWindows(可能还有标题检查)。我会编辑
  • 我不认为标题有问题 - OP 之前只是使用了 FindWindow 并且不知道你不能用 FindWindow 做他想做的事。
  • 好的,所以我用这种方法尝试了一个解决方案。我可以通过遍历 EnumWindow 并使用 GetClassName() 检查类名来获取游戏窗口。但是,该窗口具有与“当前进程”不同的进程 ID。在我上次的实验中,我得到了一个 WindowID = 20056 和一个 CurrentID = 9816。也许游戏正在运行单独的进程用于显示和代码之类的?
  • 可能是这样,但是使用ProcessExplorer很容易检查,它具有按窗口查找进程的功能以及查找加载特定DLL的进程的功能,看看你是否最终得到是否相同的过程。
【解决方案2】:

您可以结合FindWindowEx 来枚举具有给定名称的所有窗口(将hwndParent 设置为NULL 以使用桌面作为父级,并在第二次搜索时将上一个结果作为hwndChildAfter 传递, 等等) 与 GetWindowThreadProcessIdGetCurrentProcessId 找出哪个窗口属于您被调用的同一线程。

但话又说回来 - 为什么不直接将窗口句柄传递给 dll?

【讨论】:

    猜你喜欢
    • 2012-06-07
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    相关资源
    最近更新 更多