c# - 在 Windows 系统上注销用户后立即让系统进入休眠状态

标签 c# c++ sleep logoff

我有一个与用户模式模块一起运行的服务应用程序。该软件允许执行专门的电源操作,用户模式代码首先注销 Windows 用户,然后服务应用程序立即将系统置于 sleep 模式。

这种情况在某些系统上运行良好,但在其他系统上 sleep 操作失败。有时 sleep 会成功,但当我唤醒系统并尝试再次执行它时, sleep API (SetSuspendState) 挂起并且永远不会返回,而系统仍在运行。

在进行测试时,我设置了一个硬编码延迟(使用 Sleep(5000) API)似乎可以解决大多数系统上的问题,但我在其他系统上仍然得到相同的结果。在这种情况下,我不想引入更长的延迟,因为它并没有真正解决问题,或者回答了为什么它首先发生的问题。另外,我确信那里有一个“慢”系统,即使 10 秒也不够......

那么,有没有人知道如何修复 sleep API 中的这些故障?

附言。我在最新版本的 Windows 7 上运行我的测试。

最佳答案

利用SystemEvents Class .. 我希望它对你有用..

Microsoft.Win32.SystemEvents.SessionEnded+=
                       new SessionEndedEventHandler(SystemEvents_SessionEnded);

和处理方法..

private void SystemEvents_SessionEnded(object sender, SessionEndedEventArgs e)
{
    if (e.Reason == SessionEndReasons.Logoff)
    {
        //this may sleep the system even when user logs off manually.
        Application.SetSuspendState(PowerState.Suspend, true, true);
    }
}

您需要导入 using Microsoft.Win32; 命名空间

关于c# - 在 Windows 系统上注销用户后立即让系统进入休眠状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12966423/

相关文章:

c# - TcpClient 已建立,但 TcpClient.getStream() 失败

c# - 将自定义集合转换为 DataRow

c++ - 出现奇怪的 "expected primary-expression"错误

c++ - 为什么链接到 LIB 会显着增加二进制文件的大小

c# - WPF 网格 : GridSplitter event

c# - 找不到行时在转发器中显示消息

c++ - 从文件加载结构

c - 在退出进程之前,如何在C中每秒显示一个点?

java - 有没有办法让所有正在运行的线程在 Java 中 sleep ()?

vbscript - 使用 CopyHere 写入文件而不使用 WScript.Sleep