当用户选择新的功能区选项卡时,我正在尝试从 PowerPoint 2007(或理想的任何版本)中捕获 UI 自动化事件。使用 SDK 工具 Inspect 和 AccEvent 我已经确定捕获这些事件的合理“父”元素是“Ribbon Tabs”元素。
当我将 AccEvent 限定到该元素,并在自动化事件中注册 SelectionItem_ElementSelected 时,我得到了我所期望的事件 - 单击选项卡时,AccEvent 捕获并记录它。
我只被允许发布两个链接并且还不能内嵌图像,所以我做了一些马赛克来尝试将尽可能多的相关信息压缩到每个链接中,这里是与上述行为相关的链接:
http://hirstius.com/media/stackoverflow/UIA_sdk_tools.png
基于此,我想出了以下代码来从我的程序中捕获这些事件:
// Prior code gets foreground window, determines if it's PPT, and gets a handle to it
currentApp = AutomationElement.FromHandle(foregroundWindow);
// Create condition to find the "Ribbon Tabs" element
Condition propCondition = new PropertyCondition(
AutomationElement.NameProperty, "Ribbon Tabs",
PropertyConditionFlags.IgnoreCase);
// Subscribe to events on the "Ribbon Tabs" Element
SubscribeToEvents(currentApp.FindFirst(TreeScope.Descendants, propCondition));
public void SubscribeToEvents(AutomationElement element)
{
if (element != null)
{
Console.WriteLine("Subscribing to PowerPoint UIA Events on object {0} ({1})",
elementItem.GetCurrentPropertyValue(AutomationElement.NameProperty),
elementItem.GetCurrentPropertyValue(AutomationElement.AutomationIdProperty));
UIAeventHandler = new AutomationEventHandler(OnUIAutomationEvent);
// Subscribe to SelectionItemPattern.ElementSelectedEvent based off AccEvent
Automation.AddAutomationEventHandler(
SelectionItemPattern.ElementSelectedEvent,
element,
TreeScope.Descendants,
UIAeventHandler);
Console.WriteLine("Subscribed to PowerPoint UIA Events");
}
}
private void OnUIAutomationEvent(object src, AutomationEventArgs e)
{
// Make sure the element still exists
AutomationElement sourceElement;
try
{
sourceElement = src as AutomationElement;
}
catch (ElementNotAvailableException)
{
return;
}
Console.WriteLine("UIA Event ( {0} ) for item: {1}",
e.EventId.ProgrammaticName,
sourceElement.GetCurrentPropertyValue(AutomationElement.NameProperty));
}
这段代码没有任何结果。
如果我订阅顶级“窗口”,仍然没有。
如果我只是订阅顶级自动化元素,我会得到预期的事件 - 但有一个问题。在 AccEvent 中,事件仅在单击选项卡时出现,真正“被选中”。当我绑定到 Root AutomationElement 时,我在鼠标悬停/悬停时得到事件,而在单击时什么也没有。我只需要在实际选择选项卡时才出现事件(这正是 AccEvent 在作用于“功能区选项卡”元素时呈现的行为)。
结果链接:http ://hirstius.com/media/stackoverflow/UIA_Result.png
当用户在功能区上选择一个新选项卡时,我需要一种方法来通知我的 .NET 应用程序,我是否遗漏了一些明显的东西?