События автоматизации пользовательского интерфейса не попадают из PowerPoint 2007
Я пытаюсь перехватить события автоматизации пользовательского интерфейса из PowerPoint 2007 (или, в идеале, любой версии), когда пользователь выбирает новую вкладку ленты. Используя инструменты SDK Inspect и AccEvent, я определил, что разумным "родительским" элементом для захвата этих событий является элемент "Tabs Tabs".
Когда я приписываю AccEvent к этому элементу и регистрируюсь для SelectionItem_ElementSelected в событиях автоматизации, я получаю события так, как я ожидаю - когда нажата вкладка, AccEvent ловит и регистрирует ее.
Мне разрешено публиковать только две ссылки, и я пока не могу встроить изображения, поэтому я сделал несколько мозаик, чтобы попытаться втиснуть как можно больше релевантной информации в каждую ссылку, вот ссылка, относящаяся к вышеупомянутому поведению:
http://hirstius.com/media/stackru/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, когда Scoped привязан к элементу "Ribbon Tabs").
Ссылка на результаты: http://hirstius.com/media/stackru/UIA_Result.png
Мне нужен способ уведомления моего приложения.NET, когда пользователь выбирает новую вкладку на ленте, я что-то упускаю из виду?