【发布时间】:2013-04-25 08:45:53
【问题描述】:
我正在开发一个在 Windows 2003 上运行的基于终端服务的系统。它由一个桌面替换应用程序组成,用户可以从该应用程序启动程序。它还有一个注销按钮。当用户注销时,必须发生两件事。首先,他从 Windows 中注销。然后调用存储过程清理用户数据库状态。这几乎可以正常工作,但在一种情况下,即用户取消注销事件时。典型场景: 1- 用户登录,启动 MS Word,编辑文档,不保存。 2 - 然后用户按下注销按钮。 3- MS Word 对此做出反应,要求用户保存他的更改。 4 - 用户按下取消。
此时桌面应用程序可能已经调用存储过程清理数据库状态。如何在桌面应用程序中捕捉到这种行为?是否有消息说结束会话操作已取消?
我的问题有意义吗?
哦,所有的应用程序都是用 Delphi 7 编写的,但我也使用 C、C++ 和 C# 工作,因此也欢迎使用这些语言的答案。
【问题讨论】:
-
您可以在那台机器上运行服务吗? ...另外,您是否尝试过使用基于 grouppolicy 的注销脚本来启动您的存储过程?
-
我认为您应该尝试检测实际注销并假设取消:当
WM_QUERYENDSESSION消息发送到 Word 时会发生 Word-cancel;如果注销被取消,系统将永远不会发送WM_ENDSESSION消息。 -
@Medinoc:MSDN 文档指出:“当应用程序为 WM_QUERYENDSESSION 返回 TRUE 时,它会收到 WM_ENDSESSION 消息并终止,无论其他应用程序如何响应 WM_QUERYENDSESSION 消息。”这意味着我的桌面替换应用程序将收到 WM_ENDSESSION,即使它在 word 中被取消。
-
@DarkSquirrel42:是的,我可以在机器上实现和运行服务。运行注销脚本可能不是一个坏主意。但这并不能解决问题,因为如果用户通过例如 word 取消注销过程,我仍然需要启动并运行桌面替换。
-
在这种情况下,我要么选择使用注销脚本开始清理,要么运行一个服务来暂停你的 shell 进程并监听 shell 的终止(到目前为止据我所知,shell 是会话结束时将被终止的最后一个进程...)