UI Office 2013 自动化
UI automation for office 2013
我需要在 Office 2013 中自动按文件->信息->"Check For Issues"。
我设法用代码按下文件按钮:
AutomationElement window = AutomationElement.FromHandle(Window.Handle);
AutomationElementCollection buttons = window.FindAll(TreeScope.Descendants, new PropertyCondition(
AutomationElement.ControlTypeProperty, ControlType.Button));
AutomationElement file=buttons.Cast<AutomationElement>().FirstOrDefault(x => x.Current.Name == "File Tab");
InvokePattern ipClickLoadSettings = (InvokePattern)file.GetCurrentPattern(InvokePattern.Pattern);
ipClickLoadSettings.Invoke();
如何按 "Check For Issues" 按钮或信息 window 中的任何其他按钮?
谢谢
我使用 Inspect SDK 工具查看了 Word 2013 UI,这表明一些相关的 UI 可以通过 UIA Invoke 模式以编程方式调用,但有些不能。相反,需要选择或展开其他UI。所以我只是编写了下面的测试代码来执行以下操作...
- 调用文件选项卡。
- Select 信息项。
- 展开问题检查 UI。
- 调用“检查辅助功能”按钮。
虽然代码做了一些假设(并且只适用于英文版本的 Word),但它似乎能够调用检查辅助功能 UI 好的。
对于我的测试,我使用了 Windows 附带的非托管 UIA API,而不是托管 .NET UIA API .我使用使用 tlbimp.exe 工具生成的包装器从 C# 代码中调用 Windows UIA API。
这就是我生成包装器所做的...
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\x64\tlbimp.exe" c:\windows\System32\UIAutomationCore.dll /out:Interop.UIAutomationCore.dll
如果像下面这样的步骤对您不起作用,请告诉我,我可以进行调查。
谢谢,
家伙
IUIAutomation uiAutomation = new CUIAutomation8();
IUIAutomationElement rootElement = uiAutomation.GetRootElement();
// Assume the first child of the root element with a ClassName of
// "OpusApp" is the Word window we're interested in.
int propertyIdClassName = 30012; // UIA_ClassNamePropertyId
IUIAutomationCondition conditionWordApp =
uiAutomation.CreatePropertyCondition(
propertyIdClassName, "OpusApp");
IUIAutomationElement wordElement =
rootElement.FindFirst(
TreeScope.TreeScope_Children,
conditionWordApp);
// Find the File Tab beneath the Word element. Use the AutomationId
// to find the button rather than the Name, because AutomationId will
// not be localized.
int propertyAutomationId = 30011; // UIA_AutomationIdPropertyId
IUIAutomationCondition conditionFileTab =
uiAutomation.CreatePropertyCondition(
propertyAutomationId,
"FileTabButton");
// Cache the Invoke pattern when we get the FileTab element, so
// that we don't have to make another cross-process call later to
// get the pattern.
int patternIdInvoke = 10000; // UIA_InvokePatternId
IUIAutomationCacheRequest cacheRequestInvokePattern =
uiAutomation.CreateCacheRequest();
cacheRequestInvokePattern.AddPattern(patternIdInvoke);
IUIAutomationElement fileTabElement =
wordElement.FindFirstBuildCache(
TreeScope.TreeScope_Descendants,
conditionFileTab,
cacheRequestInvokePattern);
// Now invoke the tab.
IUIAutomationInvokePattern invokePatternFileTab =
fileTabElement.GetCachedPattern(patternIdInvoke);
invokePatternFileTab.Invoke();
// Note that sometimes when making calls like this, it may be necessary to
// Thread.Sleep() for a short time here, to give the target app a chance to
// create and show the UI being invoked.
// Find the Info item. Unfortunately the item has no AutomationId,
// so use other properties to find it. For this test, just use the
// localizable Name and ControlType. (So this means this code won't
// work for non-English builds of Word.)
int propertyIdName = 30005; // UIA_NamePropertyId
IUIAutomationCondition conditionInfoItemName =
uiAutomation.CreatePropertyCondition(
propertyIdName, "Info");
IUIAutomationCondition conditionInfoItemClassName =
uiAutomation.CreatePropertyCondition(
propertyIdClassName, "NetUIRibbonTab");
IUIAutomationCondition conditionInfoItem = uiAutomation.CreateAndCondition(
conditionInfoItemName, conditionInfoItemClassName);
int patternIdSelectionItem = 10010; // UIA_SelectionItemPatternId
IUIAutomationCacheRequest cacheRequestSelectionItemPattern =
uiAutomation.CreateCacheRequest();
cacheRequestSelectionItemPattern.AddPattern(patternIdSelectionItem);
IUIAutomationElement infoItemElement =
wordElement.FindFirstBuildCache(
TreeScope.TreeScope_Descendants,
conditionInfoItem,
cacheRequestSelectionItemPattern);
// Now select the Info item, to show the "Check for issues" UI.
IUIAutomationSelectionItemPattern selectionItemPatternInfoItem =
infoItemElement.GetCachedPattern(patternIdSelectionItem);
selectionItemPatternInfoItem.Select();
// Now find the "Check for issues" element. This element also has no
// AutomationId, so just search for the Name and ClassName again.
IUIAutomationCondition conditionInfoCheckForIssuesName =
uiAutomation.CreatePropertyCondition(
propertyIdName, "Check for Issues");
IUIAutomationCondition conditionCheckForIssuesClassName =
uiAutomation.CreatePropertyCondition(
propertyIdClassName, "NetUIAnchor");
IUIAutomationCondition conditionCheckForIssues =
uiAutomation.CreateAndCondition(
conditionInfoCheckForIssuesName, conditionCheckForIssuesClassName);
int patternIdExpandCollapse = 10005; // UIA_ExpandCollapsePatternId
// Expand the "Check for issues" UI, to show the "Check Accessibility"
// button.
IUIAutomationCacheRequest cacheRequestExpandCollapsePattern =
uiAutomation.CreateCacheRequest();
cacheRequestExpandCollapsePattern.AddPattern(patternIdExpandCollapse);
IUIAutomationElement checkForIssuesElement =
wordElement.FindFirstBuildCache(
TreeScope.TreeScope_Descendants,
conditionCheckForIssues,
cacheRequestExpandCollapsePattern);
IUIAutomationExpandCollapsePattern expandCollapsePatternCheckForIssues =
checkForIssuesElement.GetCachedPattern(patternIdExpandCollapse);
expandCollapsePatternCheckForIssues.Expand();
// Finally find the "Check Accessibility" element. This element also has no
// AutomationId, so once again, just search for the Name and ClassName.
IUIAutomationCondition conditionInfoCheckAccessibilityName =
uiAutomation.CreatePropertyCondition(
propertyIdName, "Check Accessibility");
IUIAutomationCondition conditionCheckAccessibiltyClassName =
uiAutomation.CreatePropertyCondition(
propertyIdClassName, "NetUITWBtnMenuItem");
IUIAutomationCondition conditionCheckAccessibility =
uiAutomation.CreateAndCondition(
conditionInfoCheckAccessibilityName,
conditionCheckAccessibiltyClassName);
IUIAutomationElement checkAccessibilityElement =
wordElement.FindFirstBuildCache(
TreeScope.TreeScope_Descendants,
conditionCheckAccessibility,
cacheRequestInvokePattern);
// Invoke this element to check the document's accessibility.
IUIAutomationInvokePattern invokePatternCheckAccessibility =
checkAccessibilityElement.GetCachedPattern(patternIdInvoke);
invokePatternCheckAccessibility.Invoke();
我需要在 Office 2013 中自动按文件->信息->"Check For Issues"。 我设法用代码按下文件按钮:
AutomationElement window = AutomationElement.FromHandle(Window.Handle);
AutomationElementCollection buttons = window.FindAll(TreeScope.Descendants, new PropertyCondition(
AutomationElement.ControlTypeProperty, ControlType.Button));
AutomationElement file=buttons.Cast<AutomationElement>().FirstOrDefault(x => x.Current.Name == "File Tab");
InvokePattern ipClickLoadSettings = (InvokePattern)file.GetCurrentPattern(InvokePattern.Pattern);
ipClickLoadSettings.Invoke();
如何按 "Check For Issues" 按钮或信息 window 中的任何其他按钮?
谢谢
我使用 Inspect SDK 工具查看了 Word 2013 UI,这表明一些相关的 UI 可以通过 UIA Invoke 模式以编程方式调用,但有些不能。相反,需要选择或展开其他UI。所以我只是编写了下面的测试代码来执行以下操作...
- 调用文件选项卡。
- Select 信息项。
- 展开问题检查 UI。
- 调用“检查辅助功能”按钮。
虽然代码做了一些假设(并且只适用于英文版本的 Word),但它似乎能够调用检查辅助功能 UI 好的。
对于我的测试,我使用了 Windows 附带的非托管 UIA API,而不是托管 .NET UIA API .我使用使用 tlbimp.exe 工具生成的包装器从 C# 代码中调用 Windows UIA API。
这就是我生成包装器所做的...
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\x64\tlbimp.exe" c:\windows\System32\UIAutomationCore.dll /out:Interop.UIAutomationCore.dll
如果像下面这样的步骤对您不起作用,请告诉我,我可以进行调查。
谢谢,
家伙
IUIAutomation uiAutomation = new CUIAutomation8();
IUIAutomationElement rootElement = uiAutomation.GetRootElement();
// Assume the first child of the root element with a ClassName of
// "OpusApp" is the Word window we're interested in.
int propertyIdClassName = 30012; // UIA_ClassNamePropertyId
IUIAutomationCondition conditionWordApp =
uiAutomation.CreatePropertyCondition(
propertyIdClassName, "OpusApp");
IUIAutomationElement wordElement =
rootElement.FindFirst(
TreeScope.TreeScope_Children,
conditionWordApp);
// Find the File Tab beneath the Word element. Use the AutomationId
// to find the button rather than the Name, because AutomationId will
// not be localized.
int propertyAutomationId = 30011; // UIA_AutomationIdPropertyId
IUIAutomationCondition conditionFileTab =
uiAutomation.CreatePropertyCondition(
propertyAutomationId,
"FileTabButton");
// Cache the Invoke pattern when we get the FileTab element, so
// that we don't have to make another cross-process call later to
// get the pattern.
int patternIdInvoke = 10000; // UIA_InvokePatternId
IUIAutomationCacheRequest cacheRequestInvokePattern =
uiAutomation.CreateCacheRequest();
cacheRequestInvokePattern.AddPattern(patternIdInvoke);
IUIAutomationElement fileTabElement =
wordElement.FindFirstBuildCache(
TreeScope.TreeScope_Descendants,
conditionFileTab,
cacheRequestInvokePattern);
// Now invoke the tab.
IUIAutomationInvokePattern invokePatternFileTab =
fileTabElement.GetCachedPattern(patternIdInvoke);
invokePatternFileTab.Invoke();
// Note that sometimes when making calls like this, it may be necessary to
// Thread.Sleep() for a short time here, to give the target app a chance to
// create and show the UI being invoked.
// Find the Info item. Unfortunately the item has no AutomationId,
// so use other properties to find it. For this test, just use the
// localizable Name and ControlType. (So this means this code won't
// work for non-English builds of Word.)
int propertyIdName = 30005; // UIA_NamePropertyId
IUIAutomationCondition conditionInfoItemName =
uiAutomation.CreatePropertyCondition(
propertyIdName, "Info");
IUIAutomationCondition conditionInfoItemClassName =
uiAutomation.CreatePropertyCondition(
propertyIdClassName, "NetUIRibbonTab");
IUIAutomationCondition conditionInfoItem = uiAutomation.CreateAndCondition(
conditionInfoItemName, conditionInfoItemClassName);
int patternIdSelectionItem = 10010; // UIA_SelectionItemPatternId
IUIAutomationCacheRequest cacheRequestSelectionItemPattern =
uiAutomation.CreateCacheRequest();
cacheRequestSelectionItemPattern.AddPattern(patternIdSelectionItem);
IUIAutomationElement infoItemElement =
wordElement.FindFirstBuildCache(
TreeScope.TreeScope_Descendants,
conditionInfoItem,
cacheRequestSelectionItemPattern);
// Now select the Info item, to show the "Check for issues" UI.
IUIAutomationSelectionItemPattern selectionItemPatternInfoItem =
infoItemElement.GetCachedPattern(patternIdSelectionItem);
selectionItemPatternInfoItem.Select();
// Now find the "Check for issues" element. This element also has no
// AutomationId, so just search for the Name and ClassName again.
IUIAutomationCondition conditionInfoCheckForIssuesName =
uiAutomation.CreatePropertyCondition(
propertyIdName, "Check for Issues");
IUIAutomationCondition conditionCheckForIssuesClassName =
uiAutomation.CreatePropertyCondition(
propertyIdClassName, "NetUIAnchor");
IUIAutomationCondition conditionCheckForIssues =
uiAutomation.CreateAndCondition(
conditionInfoCheckForIssuesName, conditionCheckForIssuesClassName);
int patternIdExpandCollapse = 10005; // UIA_ExpandCollapsePatternId
// Expand the "Check for issues" UI, to show the "Check Accessibility"
// button.
IUIAutomationCacheRequest cacheRequestExpandCollapsePattern =
uiAutomation.CreateCacheRequest();
cacheRequestExpandCollapsePattern.AddPattern(patternIdExpandCollapse);
IUIAutomationElement checkForIssuesElement =
wordElement.FindFirstBuildCache(
TreeScope.TreeScope_Descendants,
conditionCheckForIssues,
cacheRequestExpandCollapsePattern);
IUIAutomationExpandCollapsePattern expandCollapsePatternCheckForIssues =
checkForIssuesElement.GetCachedPattern(patternIdExpandCollapse);
expandCollapsePatternCheckForIssues.Expand();
// Finally find the "Check Accessibility" element. This element also has no
// AutomationId, so once again, just search for the Name and ClassName.
IUIAutomationCondition conditionInfoCheckAccessibilityName =
uiAutomation.CreatePropertyCondition(
propertyIdName, "Check Accessibility");
IUIAutomationCondition conditionCheckAccessibiltyClassName =
uiAutomation.CreatePropertyCondition(
propertyIdClassName, "NetUITWBtnMenuItem");
IUIAutomationCondition conditionCheckAccessibility =
uiAutomation.CreateAndCondition(
conditionInfoCheckAccessibilityName,
conditionCheckAccessibiltyClassName);
IUIAutomationElement checkAccessibilityElement =
wordElement.FindFirstBuildCache(
TreeScope.TreeScope_Descendants,
conditionCheckAccessibility,
cacheRequestInvokePattern);
// Invoke this element to check the document's accessibility.
IUIAutomationInvokePattern invokePatternCheckAccessibility =
checkAccessibilityElement.GetCachedPattern(patternIdInvoke);
invokePatternCheckAccessibility.Invoke();