我正在为 Metro 应用程序开发 UI 自动化客户端 (c++)。我能够在 metro UI 上获取元素。我正在使用 Raw Tree Walker
获取自动化树
automation->get_RawViewWalker(&pTreeWalker);
然后我在 metro 应用程序上迭代并获取元素
检索 UI 元素的属性
我在列表项旁边有图像和文本项。单击该按钮会启动一个网页。
列表项、图像和文本项没有调用能力。所以我试图获取可点击点,以便我可以单击该点。我还使用 Inspect.exe 查看 UI 元素。在
inspect.exe 确实显示列表项、图像和文本项的可点击点。但是当我
尝试使用 GetClickablePoint() 获取它时出现问题,我得到 gotClickable = 0 并且 POINT 字段保持为 0.hr = S=OK
POINT clickable; BOOL gotClickable; hr = p1->GetClickablePoint(&clickable,&gotClickable);
我想在对 mouse_event 的调用中使用可点击点
VOID WINAPI mouse_event(__in DWORD dwFlags, __in DWORD dx, __in DWORD dy, __in DWORD dwData,
__in ULONG_PTR dwExtraInfo );
最佳答案
检查该项目是否有一个零 hwnd。这对我来说经常出现。
您仍然可以通过将 Cursor 移动到元素的中间并发送鼠标单击事件来单击。
您可以根据边界矩形计算位置。您可能需要将客户端转换为屏幕坐标,具体取决于您的情况。
边界矩形部分是这样的:
x = left + (right - left) / 2
y = top + (bottom - top) / 2
要转换为屏幕坐标,您必须使用具有 hwnd 的元素并应用必要的偏移量。
编辑
要将光标放在矩形上,我使用 PInvoke:
这是我使用的东西 (C#):
public static void Click()
{
User32.mouse_event(WindowsConstants.MouseEventLeftDown, 0, 0, 0, IntPtr.Zero);
User32.mouse_event(WindowsConstants.MouseEventLeftUp, 0, 0, 0, IntPtr.Zero);
}
public static void RightClick()
{
User32.mouse_event(WindowsConstants.MouseEventRightDown, 0, 0, 0, IntPtr.Zero);
User32.mouse_event(WindowsConstants.MouseEventRightUp, 0, 0, 0, IntPtr.Zero);
}
public static void DoubleClick()
{
User32.mouse_event(WindowsConstants.MouseEventLeftDown, 0, 0, 0, IntPtr.Zero);
User32.mouse_event(WindowsConstants.MouseEventLeftUp, 0, 0, 0, IntPtr.Zero);
Thread.Sleep(150);
User32.mouse_event(WindowsConstants.MouseEventLeftDown, 0, 0, 0, IntPtr.Zero);
User32.mouse_event(WindowsConstants.MouseEventLeftUp, 0, 0, 0, IntPtr.Zero);
}
public const UInt32 MouseEventLeftDown = 0x0002;
public const UInt32 MouseEventLeftUp = 0x0004;
public const UInt32 MouseEventRightDown = 0x0008;
public const UInt32 MouseEventRightUp = 0x00010;
[DllImport("user32.dll")]
public static extern void mouse_event(UInt32 dwFlags, UInt32 dx, UInt32 dy, UInt32 dwData, IntPtr dwExtraInfo);
关于c++ - GetClickablePoint 不适用于 UI 自动化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11933223/