2

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

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

  1. 当新气球到达时,有没有办法取消我制作的任何未完成的气球?
  2. 我是否应该检查“会话锁定”/“屏幕锁定”并在用户不在时停止创建气球?

关于选项#2,我在 Windows 循环中监听什么消息来捕获帐户锁定/会话锁定?我尝试了事件 WM_ENDSESSION,但我的应用表现得好像它没有看到它。那是正确的事件吗?我需要注册吗?

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

ps 我很震惊,我在网上找不到带有描述的 Windows 消息列表。我发现的只是一个没有描述的列表,它甚至不是由微软托管的!!!

4

1 回答 1

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);

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

于 2011-03-04T22:26:55.153 回答