我需要为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_hwnd
与window_hwnd
具有相同的值。
感谢@Simon Mourier在我的原始帖子下的评论,我能够通过C#的FlaUI包装库使用WindowsUI自动化API创建一个工作解决方案。
我会把它(现在)标记为可接受的答案,但是,如果有人有更好的选择,我会很乐意接受相应的答案。