【问题标题】:Sending system to sleep right after logging off users on a Windows system在 Windows 系统上注销用户后立即让系统进入睡眠状态
【发布时间】:2012-10-19 02:11:38
【问题描述】:

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

此方案在某些系统上运行良好,但在其他系统上睡眠操作失败。有时睡眠会成功,但是当我唤醒系统并尝试再次执行它时,睡眠 API (SetSuspendState) 挂起并且永远不会返回,而系统仍然可以运行。

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

那么,有谁知道如何解决 sleep API 中的这些故障?

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

【问题讨论】:

  • 你真的是说 SetSuspendState 失败了吗?您确定它没有被这些系统上的驱动程序之类的东西阻止吗?
  • 不知道。阻塞很少发生。大多数情况下它只是失败,错误代码为 0。(再次,我应该说之前的注销过程与它有关,因为如果我自己调用 SetSuspendState 一切正常。)
  • 我认为,当系统注销时,它会关闭所有应用程序,包括在该用户帐户下运行的服务..也许这是不允许您的程序按预期执行的操作..尝试只是锁定系统然后休眠..
  • @dotNETbeginner:谢谢。我不能使用 lock 代替。注销是先决条件。但是说到你的想法,有没有办法找出注销过程何时结束? (请注意,系统并没有关闭,只是用户帐户正在注销。)

标签: c# c++ sleep logoff


【解决方案1】:

利用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;命名空间

【讨论】:

    【解决方案2】:

    可能是有什么东西阻止了系统进入睡眠状态。驱动程序可以禁止系统休眠,而某些系统根本无法休眠。

    当您遇到 SetSuspendState 不正常运行的情况时,请运行“powercfg -energy”和“powercfg -requests”。该实用程序在诊断睡眠问题时非常方便,因此您还应该检查“powercfg /?”看看它的所有特殊能力。

    【讨论】:

    • 文斯,我想指出,睡眠本身就很好。只有当我在注销用户后立即调用该 API 时才会出现问题。
    【解决方案3】:

    我必须将其发布为我自己问题的答案,因为此解决方案对我有用。这是一种有点麻烦的方法,所以如果有人可以发布不同的解决方案,我将不胜感激。

    简而言之,在注销用户之前,需要收集他们的会话 ID。然后为用户帐户发出一个 API 以注销,同时需要侦听并等待来自另一个线程的 WTS_SESSION_LOGOFF 通知并继续这样做,直到会话(先前收集的)被注销。

    但这还不是全部。出于某种未知原因(我无法找到相关文档),之后我们需要等待一个具有 WTSConnected 状态且没有用户名的会话。只有这样我们才能调用 SetSuspendState 进行睡眠或休眠。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多