Vb.net 在屏幕顶部找到窗口的控制柄

Vb.net 在屏幕顶部找到窗口的控制柄,vb.net,winapi,topmost,Vb.net,Winapi,Topmost,我想检查外部应用程序(在线扑克游戏桌)的窗口何时跳过所有其他窗口,因为轮到我玩了 问题是游戏桌在前景中跳跃。。。但窗口不会变为活动状态。。。这意味着我无法检查它是否被API GetForeGroundIndow跳过所有其他可见窗口(在fatc中,此API继续返回上一个窗口的句柄,也无法检查它是否位于跳过所有桌面窗口的游戏表下)。此外,getTopWindowAPI也不起作用 现在的问题是:如果顶部可见窗口(我的眼睛在所有其他打开的窗口上方的窗口)未处于活动状态,如何找到该窗口的控制柄 不,该窗

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

问题是游戏桌在前景中跳跃。。。但窗口不会变为活动状态。。。这意味着我无法检查它是否被API GetForeGroundIndow跳过所有其他可见窗口(在fatc中,此API继续返回上一个窗口的句柄,也无法检查它是否位于跳过所有桌面窗口的游戏表下)。此外,getTopWindowAPI也不起作用

现在的问题是:如果顶部可见窗口(我的眼睛在所有其他打开的窗口上方的窗口)未处于活动状态,如何找到该窗口的控制柄


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


可能是WM_SHOW或WM_NOACTIVATE标志将其置于前台。

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

为了检测此类呼叫,您可以使用

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

输出文件,扩展名为.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.
$$ ====================================
$$
$$ =============================================================================
调试会话期间的$$跟踪API。
$$在桌面和Windbg窗口上创建日志。
$$要查看更详细的日志,请从Windows调试工具运行logviewer.exe
$$并打开扩展名为.lgv的文件。
$$此文件位于桌面上的LogExt内。
$$
$$兼容性:Win32,应可在Win32上运行。
$$
$$用法:$$><以运行程序。
$$
$$Roberto Alexis Farah
$$Blog:blogs.msdn.com/debuggingtoolbox/
$$
$$我的所有脚本均按“原样”提供,不提供任何担保,也不授予任何权利。
$$ =============================================================================
$$
!logexts.loge
!logexts.logc.e*
!logexts.logo e v
!logexts.logb p
$$
$$ ====================================
已为此进程启用$$日志记录。
$$ ====================================

一旦你掌握了所有这些信息,你就会知道从特定的调用者/DLL/etc和中寻找什么API调用,也就是该轮到你的时候了,扑克窗口是打开的,你可以使用这篇KB文章来听起来应用程序可能正在使用
SetWindowPos(…,HWND_TOPMOST…)
成为最顶部的窗口。以这种方式定位的窗口不必处于活动状态才能显示在顶部


在这种情况下,您可以尝试使用
GetWindow(…,GW_HWNDFIRST)
在窗口管理器的z顺序中查找最顶部的窗口。请参阅以获取执行此操作的简短代码段。

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

+1欢迎来到,第一个问题很好!我在找那篇kb文章!你什么时候知道何时调用它?我想你应该手动获取窗口句柄,然后通过不断轮询,当从API调用返回句柄时,你知道扑克应用程序是ontop吗?不,窗口不是最顶部的窗口。一个不是的窗口t activate NEVER是z顺序中的第一个,如果是眼睛,则也是顶部窗口…z顺序中的第一个窗口是接收输入的窗口(前景窗口).>一旦你掌握了所有这些信息,你就会知道从特定的调用方/DLL/等中寻找什么API调用,这是轮到你的时候了…如何检查???通过DLL注入???我不知道如何进行DLL注入>找到最顶部窗口的句柄…它不是最顶部的窗口!冷静下来。带着所有的问号和大写冷静,好吗?在代码中,您需要轮询日志和调试器,以识别扑克应用程序调用的Win32 API事件。如果您需要这里的帮助,请对自愿帮助您的人友好。不友好?抱歉…我的原始语言不是英语,我试着更好。Ty Roman,但您的想法在这种情况下不起作用。是的,这是真的:通过EnumWindows,我可以按从上到下的顺序设置窗口句柄…但当游戏桌在前景中跳转时,窗口不会被激活,因此z顺序不会改变记事本在桌子上方,当桌子在前景中跳跃时,第一个手柄始终是记事本手柄,因为记事本仍然是活动窗口。WindowFromPoint…我在屏幕的不同位置有6-8个表格。我必须通过WindowRect检查它们的位置,并检查每个表格的5-6个点,以确保它们位于顶部…我会尝试,但我担心WindowFromPoint API会在该点下找到活动窗口的句柄。WindowFromPoint函数不会检索隐藏或禁用窗口的句柄,即使该点位于窗口内。禁用窗口:不接收输入(如鼠标单击和按键)的窗口,以及跳入前台时的表格d不接收输入,因为未激活。