2012-02-09 26 views
0

我有一個組合框包含一個列表(這是一個組合框的標準),有很多元素 - 超過100個。我想找到某些條目來選擇他們。要找到條目,我將給定的模式與每個元素的名稱進行比較。因爲性能方面的原因(超過100個元素),我在父親上使用了一個CacheRequest,它包含所有孩子的範圍,所以我可以很好地並且非常快速地通過所有孩子並找到孩子的正確索引。想要選擇。我有我想要的正確索引,我也有緩存的AutomationElement,但由於我在CacheRequest中指定了AutomationElementMode.None(我仍然必須測試它是否會對性能產生影響),我似乎無法將緩存的元素轉換爲我可以用於未來調用的元素(「實時」元素)。AutomationElement:緩存元素(通過GetCachedChildren)爲「活」元素

我試着通過NativeWindowHandle(因爲有一個函數AutomationElement.FromWindowHandle)轉換,但句柄似乎是0,所以這是沒有辦法。

我也沒有嘗試過使用緩存的SelectionPattern,但由於ComboBox有時是定製的,我不知道它是否可以在所有情況下都能正常工作(如果有的話)。

我有孩子索引,我可以得到所有我可以緩存的值 - 我怎樣才能獲得緩存元素的工作/實時AutomationElement?

感謝 安德烈亞斯

(使用C#在Windows 7 64 Win32應用程序(如自動化目標),但不應該有很大的不同)

回答

0

你有你需要的子文本除了索引?如果是這樣,是否有可能將子文本發送到組合框,就好像用戶正在鍵入來選擇您需要的子項,而不是嘗試獲取自動化元素?

始終存在IUIAutomationLegacyIAccessiblePattern,但我認爲這隻在覈心API中,而不是在客戶端(AutomationElement)中。

+0

感謝您的回答!你如何獲得這種聯繫?是否將UIAtuomation轉換爲實現該接口的對象? – 2012-08-09 08:38:16

+1

是的,但只使用非託管API,這在我看來更好。在這裏閱讀更多:http://social.msdn.microsoft.com/Forums/en-US/windowsaccessibilityandautomation/thread/c3f142e1-0624-4ec5-a313-482e72d5454d(據我可以告訴IUIAutomationLegacyIAccessiblePattern不是管理的一部分碼)。讓我知道,如果你想給非託管的嘗試,我可以添加到我的答案。 – chrismead 2012-08-09 15:08:51

0

實際上,使用AutomationElementMode.None似乎並不是最好的主意。緩存請求所花費的時間似乎只受到請求活動元素和請求多少屬性的輕微影響。 (糾正我,如果我錯了 - 我沒有系統地測試,但最近有什麼感覺時,我的緩存請求周圍有一些選項。)

它似乎主要受到您請求的UI元素的數量第一名。

所以我可以請求一個活的鏈接。

這讓我想知道現在通過一些Win32SDK函數訪問會不會更快..