События автоматизации пользовательского интерфейса не попадают из 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, когда пользователь выбирает новую вкладку на ленте, я что-то упускаю из виду?

0 ответов

Другие вопросы по тегам