Вопрос по contextmenu, click, windows, system-tray, winapi – Находит и симулирует щелчок по значку в системном трее?

2

Мне нужно выяснить, как программно найти и выбрать пункт контекстного меню из отдельного приложения.Значок в системном трее. Единственный способ представить это - использовать mouse_event () с некоторыми жестко запрограммированными значениями x / y и установить значок, который будет отображаться всегда. Помимо хакерского использования жесткого кодирования в целом, проблема здесь заключается в предположении, что значок сохранит его ».Положение (которое может сломаться в любое время, когда другое приложение загружается / выгружается). Мне было интересно, если кто-нибудь знает какой-либо другой способ пойти по этому поводу?

Это стандартная часть .NET Framework? Я могу'Кажется, он не находит подходящего пространства имен для него в браузере объектов, и он неКажется, он хорошо документирован в Интернете. RectangleEquals
Используйте UI Automation. Значки уведомлений доступны дочерним элементам области уведомлений. Raymond Chen
Преимущество использования UIA заключается в том, что вы должны быть очень осведомлены о фактической структуре пользовательского интерфейса - например, если значок скрыт, вы 'нужно знать, чтобы найти и нажать кнопку "Показать скрытые значки » ссылка сначала для доступа к нему. Кроме того, структура пользовательского интерфейса всегда подвержена изменениям между выпусками Windows, поэтому она может быть хрупкой. Но это'Вероятно, проблема с каким-либо решением вышеуказанного вопроса в любом случае; использование МАУ все еще намного менее хрупко, чем жестко закодированные местоположения! BrendanMcK

Ваш Ответ

2   ответа
2

Статья на форуме MSDN который обсуждает, как найти systemTray 'Ручка Затем статья ссылается наCodeProject Статья о том, как найти дескриптор приложения, которое вы ищете. Я не пробовал это, но похоже, что это может быть жизнеспособной отправной точкой.

Круто, спасибо! Собираюсь проверить это очень быстро и обновить вас с моими результатами. RectangleEquals
Код из статьи CodeProject неКажется, что-то выделяется в параметре dwData данного TBBUTTON. После чтения памяти процесса (на Win7) это значение равно нулю. Я могу подтвердить, что он находит правильные маркеры кнопок и даже выделяет правильный текст всплывающей подсказки для каждого, но без фактического дескриптора окна кнопок невозможно программно использовать их контекстные меню. RectangleEquals
3

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

Если приложение не используетWM_COMMAND чтобы получить выбор из контекстного меню, ваша работа намного сложнее. Не существует документированного метода определения местоположения и идентификации элементов системного трея, поэтому ваш метод жесткого кодирования значений x / y, вероятно, является лучшим вариантом, который у вас есть.

Я только что проверил, и, к счастью, да. И кажется, что WPARAM передает правильные уведомления EN_SETFOCUS и EN_KILLFOCUS. Так, что дальше? Получить ручку системного трея, перечислить ееs, затем используйте SetWindowsHookEx на нужную кнопку и отправьте сообщение WM_COMMAND? RectangleEquals
@NetMage Используйте просмотр сообщений для просмотраWM_COMMAND сообщения и посмотреть, в каком окне он будет опубликован. Jonathan Potter
@JonathanPotter И несколько лет спустя -как вы используете Spy ++, чтобы открыть окно? Параметры перетаскивания в окне поискат работа. Они нет детей из окна лотка. NetMage
@JonathanPotter Я вижу это сейчас - это не былоДля меня это было очень очевидно в моей версии Spy ++, а x86 против x64 непомогите - спасибо! NetMage

Похожие вопросы