События автоматизации пользовательского интерфейса не перехватываются из PowerPoint 2007

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


person Rex Remus    schedule 14.02.2013    source источник
comment
Привет, @rex-remus, ты нашел ответ на этот вопрос??? У меня аналогичное требование: detect-events-on-powerpoint-shapes- от до-диез   -  person Rafael Enriquez    schedule 06.05.2013
comment
Я не. И я хотел бы получить аналогичные события для форм, которые вы ищете. Я не уверен, что С#, работающий извне, может получить эту информацию через MSUIA - по крайней мере, не без вызова большого количества неуправляемого кода для потенциального перехвата взаимодействия с окном гораздо более низкого уровня (что в любом случае НЕ MSUIA). Очень интересно, если у вас есть какие-либо успехи.   -  person Rex Remus    schedule 06.05.2013
comment
Я сейчас изучаю то же самое. Не могли бы вы опубликовать код, который действительно действительно работает, чтобы мы могли сравнить? Кроме того, ни на одной из вкладок нет AutomationId — зачем вам это?   -  person Todd Main    schedule 31.05.2015
comment
Приведенный выше код в значительной степени соответствует этому. К сожалению, это был старый проект для предыдущей компании, и у меня больше нет доступа к коду. В конечном итоге проект прекратил свое существование по ряду других причин, и я так и не смог получить нужные мне события автоматизации до того, как это произошло. Я желаю вам удачи, и для сообщества было бы здорово, если бы вы могли обновить этот пост любыми возможными решениями, с которыми вы можете столкнуться.   -  person Rex Remus    schedule 02.06.2015