从 Windows7 中的安全屏幕 (Ctrl+Alt+Del) 返回时未收到 WM_PAINT 消息

Posted

技术标签:

【中文标题】从 Windows7 中的安全屏幕 (Ctrl+Alt+Del) 返回时未收到 WM_PAINT 消息【英文标题】:Not receiving WM_PAINT message when returning from Security Screen (Ctrl+Alt+Del) in Windows7 【发布时间】:2010-01-08 13:27:28 【问题描述】:

我需要检测安全屏幕的关闭,这是当用户在 windows 下按下 Ctrl+Alt+Del 时出现的全屏。 在 Xp 中,当此屏幕关闭时,我的应用程序会收到一条 wm_paint 消息,但在 windows 7 下,并不总是收到一条消息,可能只有 25% 的时间。

我尝试捕获 WM_WTSSESSION_CHANGE 消息,但只有当用户注销然后重新登录到他们的帐户时,我才会收到此消息。

不确定 Vista 中的行为,因为到目前为止我只在 XP 和 7 上测试过。

【问题讨论】:

您可能不会在 7 上一直收到 WM_PAINT 消息,因为 DWM 会缓存应用程序窗口的位图图像,即使它根本不可见。如果窗口图像已更改或 DWM 已丢弃其窗口图像的副本,它只会发送 WM_PAINT。 Vista 在这方面可能表现得像 7。 【参考方案1】:

您是否为窗口/会话调用 WTSRegisterSessionNotification() 以接收 WM_WTSSESSION_CHANGE 的子类型 (wParam)(WTS_CONSOLE_CONNECT、WTS_CONSOLE_DISCONNECT、WTS_SESSION_LOCK、WTS_SESSION_UNLOCK)?一个普通的 win32 示例位于 http://support.microsoft.com/kb/310153

看来 WTS_SESSION_UNLOCK 应该是你所追求的。

【讨论】:

我应该澄清一下,如果用户点击 ctrl alt del 则不会收到 WM_WTSSESSION_CHANGE 消息,然后只需在弹出的安全屏幕上单击取消即可。如果我锁定然后解锁帐户,我会成功收到消息。我认为问题可能与 Aero 的观察有关。 如果用户点击取消,那么会话实际上不会被锁定,因此您不会收到 WTS_SESSION_UNLOCK 消息是有道理的。除了应用程序中的简单焦点跟踪之外,我不知道您如何处理“取消”场景。 好的,这绝对是 Aero 问题。在这种情况下,显然不会发送 WM_ 消息,因为窗口在 aero 下的渲染方式不同。见social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/…

以上是关于从 Windows7 中的安全屏幕 (Ctrl+Alt+Del) 返回时未收到 WM_PAINT 消息的主要内容,如果未能解决你的问题,请参考以下文章

Windows安全模式能不能防止别的软件读取屏幕?

击键清除psql中的屏幕?

如何在 Android 模拟器中更改屏幕方向?

Windows7台式电脑怎么调节屏幕亮度

如何设定Windows占据整个屏幕

Linux命令行快捷键