Почему контекстное меню иконки в трее не работает для моего RemoteApp? - PullRequest
1 голос
/ 01 марта 2011

У меня есть приложение, которое добавляет значок в область уведомлений (он же «системный трей»), используя Shell_NotifyIcon. Значок имеет контекстное меню с различными важными командами. Когда приложение работает в локальной системе, контекстное меню работает нормально. Однако, когда приложение запускается как Terminal Services RemoteApp , при щелчке правой кнопкой мыши по значку контекстное меню не отображается. Различные основанные на клавиатуре методы для открытия контекстного меню также не работают.

Двойной щелчок на значке по-прежнему ведет себя как ожидалось, поэтому я знаю, что он не полностью сломан. Нам также нужно контекстное меню для работы. Кто-нибудь знает, что может быть не так?

Редактировать : еще одна информация: если я нажму Ctrl + Alt + End, чтобы открыть экран безопасности Windows (который позволяет выйти из системы, заблокировать сеанс и т. Д.), А затем закрыть этот экран , контекстное меню начинает работать.

1 Ответ

1 голос
/ 02 марта 2011

Похоже, что это происходит потому, что приложение не получает уведомление WM_CONTEXTMENU в случае RemoteApp. Обычные WM_RBUTTONDOWN и WM_RBUTTONUP уведомления приходят, но это все. Странно, если вы попытаетесь активировать контекстное меню с помощью клавиатуры, вы также получите WM_RBUTTONDOWN и WM_RBUTTONUP, даже если мышь не была задействована. Нажатие Ctrl + Alt + End появляется, чтобы решить эту проблему; система начинает отправлять обычные WM_CONTEXTMENU уведомления. Я предполагаю, что это ошибка в клиентском процессе удаленного рабочего стола.

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

Обходной путь, на котором я остановился, был следующий:

  1. Когда вы видите уведомление WM_RBUTTONUP, установите таймер с коротким тайм-аутом (50-100 мс).
  2. Когда вы видите уведомление WM_CONTEXTMENU, отмените таймер и откройте контекстное меню.
  3. Когда таймер срабатывает, отмените таймер и откройте контекстное меню.

Это должно работать для локального использования и использования RemoteApp. Значение времени ожидания на шаге 1 должно быть достаточно длинным, чтобы оно не истекло до появления WM_CONTEXTMENU, но не больше.

...