Я хотел бы получить текст всплывающей подсказки для элемента управления win32 legacy (а не элементы управления WPF, которые по своей сути поддерживают UI Automation).
Что я сделал:
- Учитывая интересующую вас кнопку, у меня есть ее
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, но в жиле.
Спасибо!