6

我想检查外部应用程序(在线扑克游戏桌)的窗口何时跳过所有其他窗口,因为轮到我玩了。

问题是游戏桌在前台跳转......但是窗口没有变得活跃......这意味着我无法检查它是否被API GetForegroundWindow 跳过所有其他可见窗口(以及在fatc此 API 继续返回前一个窗口的句柄,如果它位于跳过所有桌面窗口的游戏桌下)。GetTopWindow API 也不起作用。

现在的问题是:如何找到顶部可见窗口的句柄(在我的眼睛所有其他打开的窗口之上的窗口)如果它不活动?


不,该窗口不是 TopMost 窗口:事实上,如果我单击另一个窗口,它会进入后台。如果它应该是 TopMost 窗口,它将保持在顶部。

可能它被 WM_SHOW 或 WM_NOACTIVATE 标志放在前台。

4

3 回答 3

2

EnumWindows可能还有WindowFromPointAPI 函数。您可以在 VB.NET 应用程序中通过 P/Invoke 使用它们,并且能够以从上到下的顺序 (EnumWindows) 查找窗口,在识别您感兴趣的窗口的过程中检查它们的位置、标题等,或者直接定位特定位置的窗口(WindowFromPoint;我认为您感兴趣的窗口可能会在屏幕中心弹出,或者以您已经知道的另一个窗口为中心,或者您可以通过其标题轻松找到它 - 这样您就知道您的点屏幕上的兴趣已经)。

于 2012-08-26T08:00:03.630 回答
1

听起来该应用程序可能正在使用SetWindowPos(..., HWND_TOPMOST, ...)成为最顶层的窗口。以这种方式定位的窗口不必处于活动状态即可显示在顶部。

在这种情况下,您可以尝试使用GetWindow(..., GW_HWNDFIRST)在窗口管理器的 z 顺序中查找最顶层的窗口。有关执行此操作的简短代码片段,请参阅http://support.microsoft.com/kb/126386

于 2012-08-26T03:47:31.887 回答
0

扑克应用程序必须使用 Win32 API,例如SetForegroundWindow(hWnd)在轮到您时将窗口置于顶部。

为了检测这样的调用,您可以使用Windbg Script Tracing API 调用

您可以使用它从 Windbg 屏幕中查看应用程序正在使用的 API,而无需使用其他工具。如果您需要 API 的更多详细信息,只需执行 LogViewer.exe 并打开使用此脚本时自动创建的 .lgv 文件。

在此处输入图像描述

在此处输入图像描述

输出文件,扩展名为 .LGV。

在此处输入图像描述

LogViewer.exe 是 Windows 调试工具的一部分。它与您安装 Windbg 的位置相同。使用 LogViewer.exe 打开 .LGV 文件:

在此处输入图像描述

API_TRACING.TXT 的源代码:

$$
$$ =============================================================================
$$ Trace APIs during the Debugging Session. 
$$ Creates a log on Desktop and Windbg window.
$$ To see the more verbose log run logviewer.exe from Debugging Tools for Windows
$$ and open the file that has the .lgv extension.
$$ This file is inside LogExts on your desktop.
$$
$$ Compatibility: Win32, should work on Win64.
$$
$$ Usage: $$>< to run the program.
$$
$$ Roberto Alexis Farah
$$ Blog: blogs.msdn.com/debuggingtoolbox/
$$
$$ All my scripts are provided "AS IS" with no warranties, and confer no rights.
$$ =============================================================================
$$
!logexts.loge
!logexts.logc e *
!logexts.logo e v
!logexts.logb p
$$
$$ ====================================
$$ Logging is enabled for this process.
$$ ====================================

一旦你掌握了所有这些信息,你就会知道要从特定的调用者/DLL/等中寻找什么 API 调用,那就是轮到你的时候了,扑克窗口就在上面,你可以使用这篇知识库文章来查找句柄TopMost 窗口的

于 2012-08-26T03:38:49.870 回答