c# - 如何捕获在 Windows Server 2003 中取消的注销

标签 c# c++ c windows delphi

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

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

我的问题是否有意义?

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

最佳答案

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

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

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

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

Recently I wrote some guidance on RDS notifications topic.

关于c# - 如何捕获在 Windows Server 2003 中取消的注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16210277/

相关文章:

c# - 当图片框位于另一个图像上方时如何使它透明

C++:菱形继承(钻石问题)

c - 未找到信号量符号 (c)

c# - 最终用户需要什么来运行 C# 控制台程序?

c# - Html.TextBoxFor Bootstrap 日期 mvc4

c++ - Canny算法中的非极大值抑制: optimize with SSE

c++ - 使用共享库代替静态库会影响内存使用吗?

c - 简单的二维

c - 使用所有可用组合初始化结构

c# - WPF Multitrigger.ExitActions 将覆盖正常触发器