2012-08-13 105 views
0

我正在爲地鐵應用程序開發UI自動化客戶端(C++)。我能夠在UI.I正在使用原始樹沃克GetClickablePoint不適用於UI自動化

  1. 地鐵獲取自動化樹

    automation->get_RawViewWalker(&pTreeWalker); 
    
  2. 然後我循環並獲得對Metro應用

  3. 元素得到元素
  4. 檢索UI元素的屬性

    我在列表項中有圖像和文本項。點擊那個啓動一個網頁。

    列表項目,圖像和文本項目沒有調用Capability.so我想獲得可點擊的點,以便我可以點擊point.I也使用Inspect.exe來查看UI元素.in

    inspect.exe不顯示列表項,圖片和文字item.but cliackable點時,我

    有問題試圖讓使用GetClickablePoint()我得到它gotClickable = 0點場仍然0.hr = S =好的

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

出於好奇,什麼是你的UI自動化客戶端在幹嘛我最近正在研究如何在Metro GUI中自動化一些嚮導。 – 2012-08-13 11:30:16

+0

它將模擬像點擊圖像,捕獲/記錄視頻和圖片等使用行爲。在mycase圖像在裏面listitem.any建議@FrerichRaabe – 2012-08-13 11:35:56

回答

2

檢查,看是否項具有零HWND。這對我來說經常出現。

您仍然可以通過將光標移動到元素中間併發送鼠標單擊事件來進行單擊。

您可以基於邊界矩形計算位置。根據您的情況,您可能需要將客戶端轉換爲屏幕座標。

的邊框部分是一樣的東西:

x = left + (right - left)/2 
y = top + (bottom - top)/2 

要轉換到屏幕COORDS,你將不得不使用它確實有一個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); 
+0

你我需要將光標定位在邊界矩形的中間,並且問題mouse_event是它呢? – 2012-08-13 17:18:09

+0

可以告訴我APi在矩形上觸摸光標 – 2012-08-13 17:46:49

+0

糟糕。你的意思是Cursor.Position = xxx(SetCursorPos(pt.x,pt.y);) – chrismead 2012-08-13 19:04:38