杀死排队通知气球(Vista之前)

时间:2011-03-04 05:10:49

标签: c++ windows winapi system-tray balloon

我有一个非MFC,非ATL C ++应用程序,它定期在系统托盘图标上创建通知气球。如果在Vista之前的盒子上,用户锁定屏幕 - 这些新创建的“balloons are queued”,当用户最终重新登录时会造成混乱。可能有数十或数百个气球在等待。在用户重新登录!!

之前,每个气球的超时设置都不适用

所以要解决这个问题,我需要知道:

  1. 当有新气球到达时,有没有办法取消我制作的任何未完成的气球?
  2. 我是否应该检查“会话锁定”/“屏幕锁定”并在用户不在时停止创建气球?
  3. 关于选项#2,我在Windows循环中侦听哪些消息来捕获帐户锁定/会话锁定?我尝试了WM_ENDSESSION事件,但我的应用程序表现得像是没有看到它。这是正确的事吗?我需要注册吗?

    当然,如果有一种更简单的方法来解决这个问题,我很想知道。当然,对于Vista及更高版本,NIF_REALTIME uFlags选项可以轻松解决问题。

    P.S。我很震惊,我无法在线找到带有描述的Windows消息列表。我发现的只有一个list without descriptions,它甚至不是由微软托管的!

1 个答案:

答案 0 :(得分:0)

关于选项(2),您需要使用函数WTSRegisterSessionNotification注册对'SessionNotifications'的兴趣:

WTSRegisterSessionNotification(HWND hWnd, DWORD dwFlags);

将句柄传递给窗口以接收消息WM_WTSSESSION_CHANGE,并使用标志NOTIFY_FOR_THIS_SESSION,表示您希望在会话事件发生时收到消息。

您感兴趣的会话事件是WTS_SESSION_LOCK和WTS_SESSION_UNLOCK。请记住,您必须使用相应的注销功能WTSUnRegisterSessionNotification

WTSUnRegisterSessionNotification(HWND hWnd);

您需要跟踪会话的锁定/解锁/连接/断开状态,这样您就可以决定何时安排气球消息。