Windows XP 和 Windows 7 之间注销通知事件的差异

Posted

技术标签:

【中文标题】Windows XP 和 Windows 7 之间注销通知事件的差异【英文标题】:Difference in Logoff notification events between Windows XP and Windows 7 【发布时间】:2011-02-01 13:20:31 【问题描述】:

我有一个接收 Windows 会话更改通知的服务/应用程序。 我注意到 Windows XP 和 Windows 7 之间的行为差​​异,并试图确定它是错误还是记录在案的行为变化。

通知的形式为:WTSSESSION_NOTIFICATION

Windows XP 按预期报告:WTS_SESSION_LOGON 在 Windows GUI 登录时和:WTS_SESSION_LOGOFF 在 Windows GUI 注销时。

在 Windows 7 x64 下,在 gui 登录时生成 WTS_SESSION_LOGON,但在注销时,我得到一个 WTS_CONSOLE_DISCONNECT 事件而不是 WTS_SESSION_LOGOFF 事件。

这是一个错误还是版本之间的常量值发生了变化?它对我开发的服务不是很重要,但我仍然想知道为什么它的行为不同。

【问题讨论】:

WTS_CONSOLE_DISCONNECT 事件而不是 WTS_CONSOLE_DISCONNECT? 常量值没有改变,WTS_CONSOLE_DISCONNECT 是为 XP 定义的(根据快速谷歌搜索)。注销事件完全消失了吗?也许Win7只是在注销之前断开会话? 您使用的是WTSRegisterSessionNotification 还是RegisterServiceCtrlHandlerEx?由于会话隔离,我不希望前者适用于 Vista 或 Windows 7 上的服务。 @Adrian:在 Vista 之前,您可以进行多个会话。 WTSRegisterSessionNotification 适用于具有 HWND 而服务通常没有的事物。 (我没有测试,但我希望带有 all 标志的 WTSRegisterSessionNotification 也会收到 NT6 上的每个通知) @Anders:我知道服务通常没有窗口。但是在 XP 中它们可以有一个窗口,而在 Vista+ 中它们不能,因为它们是在非交互式会话中运行的。如果该服务最初是为 XP 设计的并且依赖于一个窗口,那么这就可以解释问题。 【参考方案1】:

在 Windows 7 下,只有服务可以接收 WTS_SESSION_LOGOFF 事件。当服务收到通知时,注销过程已经结束(因此用户正在运行的所有应用程序都已被终止)。

【讨论】:

回复:(WTS_CONSOLE_DISCONNECT 事件而不是 WTS_CONSOLE_DISCONNECT?)这是一个错误,我已经编辑了问题,所以现在措辞正确。 有问题的代码实际上是一个服务。它应该独立于任何给定的登录会话运行,实际上应该跟踪谁登录和退出以构建和活动日志。由于这是我编写的第一个本机服务,我可能在其行为方面做错了,如果它仅在登录会话期间启动,那么它工作错误。我发现奇怪的是,只有 Windows 7 提供了控制台断开事件而不是会话注销。 Windows Vista 提供了类似于 XP 的会话注销功能,我觉得这更令人惊讶。 因为这个服务需要做的就是跟踪某人已经登录和注销。与预期不同的事件被触发的事实比任何事情都更令人烦恼。由于我找不到任何说明行为应该已经改变的文档,我不知道这是否只是 Windows 7 中的一个错误。在联系 Microsoft 之前,我想彻底检查这是否真的可能是错误或至少在我联系 Microsoft 之前未记录的行为变化让我看起来很愚蠢(或至少比平时更愚蠢)。 @Carl 您的服务在哪个帐户下运行?它是否出现在 services.msc 列表中?

以上是关于Windows XP 和 Windows 7 之间注销通知事件的差异的主要内容,如果未能解决你的问题,请参考以下文章

windows xp mui是啥怎么用

请问windows xp home和windows xp prof.有啥区别?

Windows 7 XP 模式和 Visual Studio 2003

获取 XP、Vista 和 7 的 windows 序列号

Windows XP/Windows 7/Windows 8/Windows 10系统封装的另类教程和思路

Windows XP 和 Windows 7 中的不同程序行为