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