【问题标题】:GetClickablePoint is not working for UI AutomationGetClickablePoint 不适用于 UI 自动化
【发布时间】:2012-08-14 02:23:04
【问题描述】:

我正在为 Metro 应用程序开发 UI 自动化客户端 (c++)。我可以在 Metro UI 上获取元素。我正在使用 Raw Tree Walker

  1. 获取自动化树

    automation->get_RawViewWalker(&pTreeWalker);
    
  2. 然后我正在迭代并获取 Metro 应用程序上的元素

  3. 检索 UI 元素的属性

    我在列表项旁边有图像和文本项。单击该启动网页。

    list item, image and Text item没有Invoke Capability。所以我想获取Clickable Point,这样我就可以点击了。我也在用Inspect.exe查看UI element.in

    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  );

【问题讨论】:

  • 出于好奇,您的 UI 自动化客户端在做什么?我最近正在研究如何在 Metro GUI 中自动化一些向导。
  • 它将模拟使用动作,如单击图像、捕获/录制视频和图片等。在我的情况下,图像在列表项中。任何建议@FrerichRaabe

标签: c++ visual-c++ automation microsoft-ui-automation


【解决方案1】:

检查项目的 hwnd 是否为零。这对我来说经常出现。

您仍然可以通过将光标移动到元素的中间并发送鼠标单击事件来单击。

您可以根据边界矩形计算位置。根据您的情况,您可能需要将客户端转换为屏幕坐标。

边界矩形部分类似于:

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);

【讨论】:

  • 我需要将光标定位在边界矩形的中间,问题是 mouse_event 吗?
  • 可以告诉我 API 将光标放在矩形上
  • 糟糕。你的意思是 Cursor.Position = xxx (SetCursorPos(pt.x,pt.y);)
猜你喜欢
  • 2017-03-24
  • 2013-11-03
  • 1970-01-01
  • 2020-05-05
  • 2015-08-05
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
相关资源
最近更新 更多