簡體   English   中英

在沒有InvokePattern或clickablePoint的情況下使用UI Automation調用單擊按鈕

[英]Invoke on click on a button using UI Automation with no InvokePattern or clickablePoint

我嘗試向另一個應用程序中的按鈕發送單擊消息(或調用)。

我使用UISpy.exe,可以找到我需要的元素。

但它沒有id,沒有clickablePoint,也沒有Invoke模式。

我試過以下代碼:

var processStartInfo = new ProcessStartInfo(@"tdesktop\Program.exe");
        var proc = Process.Start(processStartInfo);
        Thread.Sleep(3000);
        AutomationElement mainWin = AutomationElement.RootElement.FindChildByProcessId(proc.Id);
        List<AutomationElement> elmList= GetChildren(mainWin);
        //MessageBox.Show(elmList.Count.ToString());
        if (elmList.Count == 7)
        {
           List<AutomationElement> menubar= GetChildren(elmList[6]);

           AutomationElement elementNode = menubar[1];
           double x = elementNode.GetClickablePoint().X;
           double y = elementNode.GetClickablePoint().Y;

           win32 w = new win32();
           w.move_left_click((UInt32)x, (UInt32)y);


        }

它在elementNode.GetClickablePoint()。X中拋出一個異常,即Autumation Element沒有可點擊的點。

我也試過TryGetInvokePattern()但仍然拋出execption它沒有InvokePattern。

我使用VS2012和.net 4.5

有沒有辦法做到這一點?

正如已經建議的那樣,我強烈建議將Inspect SDK工具指向您感興趣的UI。工具(inspect.exe)可以在“C:\\ Program Files(x86)\\ Windows Kits \\ 8.1”等地方找到。 \\ BIN \\ 64" 。

通過使用該工具,您可以看到如何以編程方式公開感興趣的UI元素。 例如,它是作為單個UIA元素公開的,還是一個更大的UIA元素的一部分,它表示一組可視化的UI元素,它支持哪些UIA模式? 作為測試,我只是指向Inspect中的一個箭頭形狀。 結果如下所示。

在此輸入圖像描述

所以我可以告訴箭頭以編程方式暴露為單個UIA元素,並且它支持Invoke模式。 這意味着我可以通過UIA以編程方式調用按鈕。 (我可以在Inspect的Action菜單中調用元素上的模式方法,這非常方便。)如果UIA元素不支持任何允許我以編程方式控制它的模式,我可以通過UIA找到它的BoundingRectangle屬性,並在其中間模擬鼠標單擊以調用它。 (當我模擬鼠標點擊時,我假設按鈕沒有被遮擋。)

但是如果我看一下屏幕上可視化顯示的另一組元素,使用Inspect我可以了解整個集合是通過UIA作為單個UIA元素公開的。 因此,在下面顯示的Inspect圖像中,我可以了解到我無法以編程方式調用該組中的特定顏色。

在此輸入圖像描述

所以在這種情況下,我可能不得不假設我知道在該組中可視化顯示的UI元素的大小和布局,並根據我想要調用的顏色模擬鼠標點擊,我覺得這是合適的。

通過使用Inspect,我可以很好地理解我的選擇。 理想情況下,屏幕上可視化顯示的單個元素將通過UIA作為單個元素公開,我可以通過任何相關的模式來控制(例如,Invoke,Toggle,SelectionItem等)。 但是如果不支持有用的模式,那么我可以考慮根據ClickablePoint或BoundingRectangle數據公開的模擬鼠標點擊。

謝謝,

家伙

菜單欄不顯示InvokePattern (請參閱MenuBar控件類型的UI自動化支持 )。 但是,菜單項可以是Invoke d(請參閱MenuItem控件類型的UI自動化支持 )。

以下代碼說明了如何生成菜單項列表:

AutomationElementCollection items = menubar.FindAll(
    TreeScope.Children,
    new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.MenuItem));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM