C++ GetClickablePoint不适用于UI自动化
我正在为metro应用程序开发UI自动化客户端(c++)。我可以在metro UI上获取元素。我使用的是原始树行者C++ GetClickablePoint不适用于UI自动化,c++,visual-c++,automation,microsoft-ui-automation,C++,Visual C++,Automation,Microsoft Ui Automation,我正在为metro应用程序开发UI自动化客户端(c++)。我可以在metro UI上获取元素。我使用的是原始树行者 获取自动化树 automation->get_RawViewWalker(&pTreeWalker); 然后我在metro应用程序上迭代并获取元素 检索UI元素的属性 我在列表项旁边有图像和文本项。点击启动一个网页 列表项、图像和文本项没有调用功能。因此,我正在尝试获取可单击点,以便可以单击该点。我还使用Inspect.exe查看UI元素。在 inspect.ex
automation->get_RawViewWalker(&pTreeWalker);
POINT clickable;
BOOL gotClickable;
hr = p1->GetClickablePoint(&clickable,&gotClickable);
VOID WINAPI mouse_event(__in DWORD dwFlags, __in DWORD dx, __in DWORD dy, __in DWORD dwData,
__in ULONG_PTR dwExtraInfo );
检查项目的hwnd是否为零。这对我来说经常出现 您仍然可以通过将光标移动到元素的中间并发送鼠标单击事件来单击 可以根据边界矩形计算位置。根据您的情况,您可能需要将客户端坐标转换为屏幕坐标 边界矩形部分类似于:
x = left + (right - left) / 2
y = top + (bottom - top) / 2
要转换为屏幕坐标,必须使用具有hwnd的元素并应用必要的偏移量
编辑
要将光标放置在矩形上,我使用PInvoke:
这是我使用的东西(C#):
出于好奇,您的UI自动化客户端在做什么?我最近在研究如何在Metro GUI中自动化一些向导。它将模拟使用诸如单击图像之类的操作,捕获/录制视频和图片等。在mycase中,图像位于listitem内。是否有任何建议@Frerichraabee您是否需要将光标定位在边框的中间,以及是否存在问题鼠标事件?是否可以告诉我将光标放置在矩形框上的APi。你是说Cursor.Position=xxx(SetCursorPos(pt.x,pt.y);)
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);