2014-08-29 75 views
5

我正在嘗試單擊使用調用模式的按鈕。Microsoft UI自動化:調用模式異常

InvokePattern ipAddMPButton = (InvokePattern)aeAddMPButton.GetCurrentPattern(InvokePattern.Pattern); 
     try 
     { 
      ipAddMPButton .Invoke(); 
     } 
     catch (System.Runtime.InteropServices.COMException e) 
     { 
      // TODO 
     } 

它拋出COMException,我想不通爲什麼?

當我運行此代碼時,該按鈕實際上被按下,功能運行良好。但之後它會停止一段時間,並拋出此異常。

+0

另外,如果它的實際執行操作,那麼爲什麼擔心只是趕上例外,並繼續作爲流程......這是在你沒有得到堅實的解決方案的情況下 – 2014-12-01 06:26:04

+0

我實際上有相同的在我試圖用UIAutomation操作的應用程序中的行爲。就我而言,這發生在打開Winforms對話框的Winforms按鈕上(我相信它們可能是消息框)。調用線程正好停留了1分鐘,然後拋出異常「0x80040201 - 事件無法調用任何訂戶。」我使用Inspect.exe工具測試了這些按鈕,雖然看不到異常,但它表現出類似的行爲,即在調用Invoke(儘管調用正確執行)後凍結了一分鐘。 – 2016-02-17 06:59:16

+0

它是一個標準的Winforms按鈕還是它特別的東西?你有任何複製代碼? 0x80040201是UIA_E_ELEMENTNOTAVAILABLE,因此,它可能是一個競速條件問題,就像在應用程序中的某些代碼在所有通信結束之前,在您的UIA應用程序和目標應用程序之間的所有通信結束之前銷燬該按鈕的時間太早。 – 2016-02-19 15:57:04

回答

1

嘗試檢查aeAddMPButton.GetAllSupportedPatterns(),然後嘗試調用的話..

+0

這是否有任何合理的解釋,還是僅僅是一種「敲木」魅力? – 2016-02-23 08:54:22

+0

對GetAllSupportedPatterns()的調用返回元素的所有支持模式。上述異常在不支持異常的情況下引發,或者(極少數情況下)模式未加載。 生成的列表確保只遍歷加載/支持的模式,從而避免引發無效模式異常的可能性 – 2016-02-24 09:39:20

+0

您是對的,但我相信在這種情況下,問題不是不支持的模式,而是該按鈕不會從Invoke調用返回,如我在下面的答案中引用的。如果模式不被支持,則該異常不會被捕獲,因爲GetCurrentPattern會拋出異常並且它位於try塊之外。 – 2016-02-24 09:53:56

2

其實我發現,這是已經在這裏討論:https://social.msdn.microsoft.com/Forums/en-US/673bba3d-27b3-4374-b049-0d2e8ec5e462/hang-with-invokepattern-invoke-in-virtual-pc?forum=windowsaccessibilityandautomation。總而言之,Winforms打開模式對話框不會很好地與UIAutomation一起使用,因爲它不會從Invoke命令返回,只會創建模式對話框,當然這會阻止它完成操作。建議的解決方案是產生後臺線程並激活該線程的Invoke(或任何其他操作)。我還建議強制執行某種操作完成的超時,因爲在某些情況下可能會很長。