Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Windows系统上注销用户后立即将系统发送到睡眠状态_C#_C++_Sleep_Logoff - Fatal编程技术网

C# 在Windows系统上注销用户后立即将系统发送到睡眠状态

C# 在Windows系统上注销用户后立即将系统发送到睡眠状态,c#,c++,sleep,logoff,C#,C++,Sleep,Logoff,我有一个与用户模式模块一起运行的服务应用程序。软件允许执行专门的电源操作,用户模式代码首先记录Windows用户,然后服务应用程序将系统置于睡眠模式 此场景在某些系统上运行良好,但在其他系统上睡眠操作失败。有时,睡眠会成功,但当我唤醒系统并再次尝试执行时,睡眠API(SetSuspendState)会挂起,并且永远不会返回,而系统仍然可以运行 在进行测试时,我使用了一个硬编码延迟(带有Sleep(5000)API),这似乎解决了大多数系统上的问题,但在其他系统上仍然得到了相同的结果。在这种情况下

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

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

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

那么,有人知道如何在sleep API中修复这些故障吗


另外,我在最新版本的Windows 7上运行测试。

可能是有什么东西阻止了系统睡眠。驾驶员可以禁止系统睡眠,有些系统根本无法睡眠

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

利用。。我希望它对你有用

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);
    }
}

您需要使用Microsoft.Win32导入
名称空间

我必须将此作为我自己问题的答案发布,因为此解决方案适合我。这是一个有点麻烦的方法,所以如果有人能发布一个不同的解决方案,我将不胜感激

因此,简而言之,在注销用户之前,需要收集他们的会话ID。然后为用户帐户发出API以注销,同时需要侦听并等待来自另一个线程的WTS_会话_注销通知,并继续执行此操作,直到会话(以前收集的)注销为止


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

你真的是说SetSuspendState失败了吗?你确定它没有被这些系统上的驱动程序之类的东西阻止吗?不知道。阻塞很少发生。大多数情况下,它只是失败,错误代码为0。(同样,我应该说,前面的注销过程与此有关,因为如果我自己调用SetSuspendState,一切正常。)我认为,当系统注销时,它会关闭所有应用程序,包括在该用户帐户下运行的服务。也许这是不允许您的程序执行的目的。请尝试锁定系统然后睡眠。@dotnebeginner:谢谢。我不能用锁代替。注销是一个先决条件。但是说到你的想法,有没有办法知道注销过程何时结束?(请注意,系统并没有关闭,只是用户帐户正在注销。)文斯,我想指出,睡眠本身工作正常。只有当我在注销用户后立即调用该API时,问题才会发生。