【发布时间】: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 设计的并且依赖于一个窗口,那么这就可以解释问题。
标签: c winapi events session service