Подтвердить что ты не робот

Получить программную подсказку Win32 legacy tooltip программно

Я хотел бы получить текст всплывающей подсказки для элемента управления win32 legacy (а не элементы управления WPF, которые по своей сути поддерживают UI Automation).

Screenshot of the buttons

Что я сделал:

  • Учитывая интересующую вас кнопку, у меня есть ее AutomationElement и ее ограничивающий прямоугольник
  • Я навел курсор на эту кнопку (в коде);
  • Thread.Sleep(1500) ждать появления всплывающего меню всплывающей подсказки; сильный текст. Перечислите рабочий стол всех дочерних окон и получите дочернее окно tooltipAutomationElement, тип которого "Tooltip";
  • Из tooltipAutomationElement, получите это свойство имени всплывающей подсказки, которое соответствует строке всплывающей подсказки.

Это действительно работает, но штраф: я должен sleep(1500) и вручную дождаться появления всплывающей подсказки (нужно отсканировать 5-20 кнопок для строк всплывающей подсказки), что не соответствует требованиям к производительности.

Ожидается (не уверен, насколько это возможно)

  • Программно получить строку подсказки кнопки, не требуя появления всплывающей подсказки
  • Без необходимости наводить указатель мыши на каждую кнопку один за другим.

Обновление 1. Для TTN_NEEDTEXT документ MSDN кажется не очень понятным, и я не знаю, как программировать его с помощью С#. Одна из соответствующих ссылок для структур/сообщений низкого уровня, связанных с управлением всплывающей подсказкой, можно найти здесь.

Обновление 2. Те, кто считает, что это может быть сделано..., я бы сказал, это легче сказать, чем сделать. Я приветствую тех, кто пытался, прокомментировать это, и некоторые якобы возможные решения приветствуются, если вы можете предложить некоторые доказательства, чтобы показать его применимость и эффективность.

Обновление 3. Если мы попытаемся свести к минимуму TTM_SETDELAYTIME, чтобы N в sleep(N) можно было свести к минимуму, это не сработает после некоторых экспериментов. Мы можем отрегулировать это только после того, как существует дескриптор окна всплывающей подсказки. например.

SendMessage(_tooltipCtrl.Handle, TTM_SETDELAYTIME, _TTDT_INITIAL, 10); //10 ms

Обновление 4: использование сообщения TTM_GETTEXTA представляется решением, однако оно похоже на Update 3, где нам нужен дескриптор tooltipCtrl, который доступен только ПОСЛЕ tooltip создается, поскольку для создания этой всплывающей подсказки у нас нет выбора, кроме как навести курсор мыши над инструментом, который, как представляется, имеет проблемы с производительностью (Thread.Sleep), как описано выше.

SendMessage(_tooltipCtrl.Handle, TTM_GETTEXTA, 0, ti);

Обновление 5: "Как получить текст всплывающей подсказки", используя InterOp (PInvoke) или пользовательский интерфейс автоматизации, используя традиционный подход (мышь, зависающая в окне инструмента, найдите Hwnd-дескриптор, затем получите его текст...) не беспокоит этот пост. Что ожидается: Можно ли извлечь строку подсказки элемента управления (например, кнопку) без необходимости наведения указателя на элемент управления? Если да, то как?

Обновление 6: использование WM_MOUSEHOVER для активации окна всплывающей подсказки кажется неработоспособным, я проверил это с помощью SendMessage (...) с правильными wparam и lparam, но в жиле.

Спасибо!

4b9b3361

Ответ 1

Просто подумайте, но попробуйте использовать сообщения, а не использовать фактическую мышь.

Играйте с WM_HOVER, WM_MOUSEHOVER, WM_MOUSEENTER

 SendMessage(_buttonCtrl.Handle, WM_MOUSEHOVER, ..., ...)

и др.

Ваш скриншот выглядит как настраиваемый элемент управления, поэтому нужно будет взломать, чтобы выяснить, что вызывает подсказку.

Потенциально вы можете одновременно отправить несколько WM_MOUSEENTER или WM_MOUSEHOVER. Это действительно зависит от базового кода.

Если это вызывает слишком длительную задержку (и ни одна из предлагаемых решений не работает), подумайте о том, чтобы вытащить тестирование всплывающей подсказки во вторичный тестовый пул, который выполняется реже или только по конкретному запросу.

Также... и я уверен, что вы уже пробовали это... но если нет, посмотрите UI Spy и посмотрите если он сообщает какую-либо информацию о всплывающей подсказке перед ее фактическим созданием.

Ответ 2

Самое лучшее, что можно сделать с точки зрения автоматизации пользовательского интерфейса, - это подписаться на всплывающее всплывающее событие и в процессе обработчика событий. Эта ссылка имеет образец http://msdn.microsoft.com/en-us/library/ms752286.aspx. Список событий автоматизации пользовательского интерфейса можно найти здесь http://msdn.microsoft.com/en-us/library/ms748252.aspx. Подробности о AutomationElement.ToolTipOpenedEvent можно найти здесь http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.tooltipopenedevent.aspx.

С помощью автоматизации пользовательского интерфейса, по крайней мере, мы должны позволить вещам произойти, либо нажимать кнопку, либо открывать окно, либо отображать всплывающую подсказку. Таким образом, подписка на события ToolTip будет работать здесь с лучшей производительностью, чем жесткие задержки Sleep(). В противном случае хакерский путь (хотя и не до конца), как упоминалось несколькими, заключается в том, чтобы получить идентификаторы строки ресурсов для строки всплывающей подсказки и проверить строки ресурсов во время выполнения автоматических тестов.