提问者:小点点

使用全局屏幕坐标获取Win32控件的HWND


我需要为Windows应用程序自动化项目实现一些间谍式的功能。为了简单起见,让我们假设我的应用程序A(用C#或C编写)正在尝试自动化现有的Win32 ApplicationB(不是WPF或OpenGL应用程序)。让我们还假设应用程序B有一个我想捕获的图片框。B中这个图片框的确切大小和位置在运行时不知道,因为它是由B动态创建和调整大小的。但是,可以肯定的是,全局屏幕坐标(x, y)将始终位于相关图片框内。

我可以在运行时使用[user32. dll]FindWindow检索B的主窗口句柄。但是,B中的图片框在运行时具有我的应用程序(A)未知的HWND。如果我知道它位于全局屏幕坐标(x,y)下,当B最大化并处于前台时,我可以检索图片框'HWND吗?

我尝试了@David Heffernan在注释中提出的解决方案(即函数的用法([user32. dll]WindowFromPoint)[https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-windowfrompoint],但是这不起作用:

void* window_hwnd = FindWindow(null, "<title of the window>");

SendMessage(window_hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
ShowWindow(window_hwnd, SW_MAXIMIZE);
SetForegroundWindow(window_hwnd);
SetActiveWindow(window_hwnd);
SetWindowPos(window_hwnd, null, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
RedrawWindow(window_hwnd, null, null, RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);

void* control_hwnd = WindowFromPoint(300, 300);

理论上,这应该会给我位置(x=300, y=300)的控件的HWND。但是,control_hwndwindow_hwnd具有相同的值。


共1个答案

匿名用户

感谢@Simon Mourier在我的原始帖子下的评论,我能够通过C#的FlaUI包装库使用WindowsUI自动化API创建一个工作解决方案。

我会把它(现在)标记为可接受的答案,但是,如果有人有更好的选择,我会很乐意接受相应的答案。