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 home和windows xp prof.有啥区别?
Windows 7 XP 模式和 Visual Studio 2003