Убийство воздушных шаров в очереди (до Vista) - PullRequest
2 голосов
/ 04 марта 2011

У меня есть приложение M ++, не-ATL C ++, которое обычно создает всплывающие уведомления на значке в системном трее. Если в окнах, предшествующих Vista, пользователь блокирует экран - эти вновь созданные « шары находятся в очереди », что создает беспорядок, когда пользователь наконец-то снова входит в систему. Там могут быть десятки или сотни воздушных шаров, ожидающих , Тайм-аут, установленный для каждого всплывающего окна, не применяется, пока пользователь снова не войдет в систему !!

Итак, чтобы решить эту проблему, мне нужно знать либо:

  1. Есть ли способ отменить любой выдающийся шар, который я сделал, когда появится новый шар?
  2. Стоит ли вместо этого проверять наличие "блокировки сеанса" / "блокировки экрана" и прекращать создание всплывающих подсказок в отсутствие пользователя?

Что касается опции №2, какое сообщение я слушаю в цикле Windows, чтобы захватить блокировку учетной записи / блокировку сеанса? Я попробовал событие WM_ENDSESSION, но мое приложение работало так, как будто его не было. Это правильное событие? Нужно ли регистрироваться для этого?

Конечно, если есть более простой способ решить эту проблему, я бы хотел знать. Конечно, для Vista и более поздних версий опция NIF_REALTIME uFlags решает проблему легко.

p.s. Я потрясен, что не могу найти список сообщений Windows онлайн с описаниями. Все, что я нашел, это список без описания , и он даже не был размещен в Microsoft !!!

1 Ответ

0 голосов
/ 05 марта 2011

Относительно опции (2) вам необходимо зарегистрировать интерес в 'SessionNotifications', используя функцию WTSRegisterSessionNotification :

WTSRegisterSessionNotification(HWND hWnd, DWORD dwFlags);

Вы передаете дескриптор окну, чтобы получить сообщение WM_WTSSESSION_CHANGE и используйте флаг NOTIFY_FOR_THIS_SESSION, который указывает, что вы хотите получать сообщения, когда происходят события сеанса.

Интересующие вас сеансовые события: WTS_SESSION_LOCK и WTS_SESSION_UNLOCK.Имейте в виду, что вы должны использовать соответствующую функцию отмены регистрации WTSUnRegisterSessionNotification :

WTSUnRegisterSessionNotification(HWND hWnd);

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

...