3

我正在开发一个在 Windows 2003 上运行的基于终端服务的系统。它由一个桌面替换应用程序组成,用户可以从中启动程序。它还有一个注销按钮。当用户注销时,必须发生两件事。首先,他从 Windows 中注销。然后调用存储过程清理用户数据库状态。这几乎可以正常工作,但在一种情况下,即用户取消注销事件时。典型场景: 1- 用户登录,启动 MS Word,编辑文档,不保存。2 - 然后用户按下注销按钮。3- MS Word 对此做出反应,要求用户保存他的更改。4 - 用户按下取消。

此时桌面应用程序可能已经调用存储过程清理数据库状态。如何在桌面应用程序中捕捉到这种行为?是否有消息说结束会话操作已取消?

我的问题有意义吗?

哦,所有的应用程序都是用 Delphi 7 编写的,但我也使用 C、C++ 和 C# 工作,所以这些语言的答案也很受欢迎。

4

1 回答 1

0

如果您的用户状态逻辑在您的外壳替换中,那么请考虑重新设计应用程序:将自定义外壳与会话管理分离。

例如:在服务中移动您的用户状态逻辑。在 RDS 通知的此服务寄存器中:WTS_SESSION_LOGON/WTS_SESSION_LOGOFF。

我认为 WTS_SESSION_LOGOFF在实际注销发生时发送,即如果用户单击 Word 中的取消按钮,则 Windows 会知道用户实际上没有注销并且操作系统不会发送 WTS_SESSION_LOGOFF(这未经测试,但听起来合乎逻辑)。

这样你就不用处理 WM_ENDSESSION/WM_QUERYENDSESSION 的东西了。

最近我写了一些关于 RDS 通知主题的指南。

于 2013-04-25T20:01:56.480 回答