Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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#_Windows - Fatal编程技术网

C# 如何防止Windows进入空闲状态?

C# 如何防止Windows进入空闲状态?,c#,windows,C#,Windows,我正在开发一个C#应用程序,它在后台运行,没有任何Windows控件 我想通知Windows我的应用程序仍处于活动状态,以防止Windows进入空闲状态 是否有任何API可从我的应用程序调用,以通知Windows操作系统我的应用程序仍处于活动状态 提前感谢。您可以使用此处介绍的SetThreadExecutionState: 因为它是一个Win32 API函数,所以要从C#使用它,需要PInvoke。这里描述了这些步骤,包括一个示例方法preventspeep,用于临时禁用睡眠模式:

我正在开发一个C#应用程序,它在后台运行,没有任何Windows控件

我想通知Windows我的应用程序仍处于活动状态,以防止Windows进入空闲状态

是否有任何API可从我的应用程序调用,以通知Windows操作系统我的应用程序仍处于活动状态


提前感谢。

您可以使用此处介绍的
SetThreadExecutionState

因为它是一个Win32 API函数,所以要从C#使用它,需要PInvoke。这里描述了这些步骤,包括一个示例方法
preventspeep
,用于临时禁用睡眠模式:


您有两种选择:

  • 使用,其中:

    使应用程序能够通知系统它正在使用,从而防止系统在应用程序运行时进入睡眠状态或关闭显示器

    您可以使用
    ES\u SYSTEM\u REQUIRED
    标志

    通过重置系统空闲计时器,强制系统处于工作状态

  • 用于模拟击键、鼠标移动/单击

  • 另一种选择是将应用程序更改为Windows服务
SetThreadExecutionState示例

// Television recording is beginning. Enable away mode and prevent
// the sleep idle time-out.
SetThreadExecutionState(
    ES_CONTINUOUS | 
    ES_SYSTEM_REQUIRED | 
    ES_AWAYMODE_REQUIRED);

// Wait until recording is complete...
// Clear EXECUTION_STATE flags to disable away mode and allow the system
// to idle to sleep normally.
SetThreadExecutionState(ES_CONTINUOUS);

我不认为有任何方法可以直接在托管代码中实现这一点

快速搜索可以发现两年前的帖子。基本上,您需要执行一些互操作来调用原始的windows API

您必须使用函数。大概是这样的:

public partial class MyWinForm: Window
{
    private uint fPreviousExecutionState;

    public Window1()
    {
        InitializeComponent();

        // Set new state to prevent system sleep
        fPreviousExecutionState = NativeMethods.SetThreadExecutionState(
            NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED);
        if (fPreviousExecutionState == 0)
        {
            Console.WriteLine("SetThreadExecutionState failed. Do something here...");
            Close();
        }
    }

    protected override void OnClosed(System.EventArgs e)
    {
        base.OnClosed(e);

        // Restore previous state
        if (NativeMethods.SetThreadExecutionState(fPreviousExecutionState) == 0)
        {
            // No way to recover; already exiting
        }
    }
}

internal static class NativeMethods
{
    // Import SetThreadExecutionState Win32 API and necessary flags
    [DllImport("kernel32.dll")]
    public static extern uint SetThreadExecutionState(uint esFlags);
    public const uint ES_CONTINUOUS = 0x80000000;
    public const uint ES_SYSTEM_REQUIRED = 0x00000001;
}

下面是
SetThreadExecutionState
C#implementation

请务必让您的用户知道应用程序需要持续运行,并防止Windows闲置。这对于使用笔记本电脑的用户尤其重要。在我们客户端的某些Windows XP计算机上,NativeMethods.SetThreadExecutionState从不返回0,知道吗?@Alessio-返回
0
表示该方法失败。从
SetThreadExecutionState
-“如果函数成功,返回值为上一个线程执行状态。如果函数失败,返回值为NULL。”(注意——我想你可能已经明白了这一点,但为了完整起见,我想发布一个答案,并帮助可能出现并查看你评论的其他人)在试图用运行windows 8.1的Surface Pro 3解决一个反复出现且难以解决的睡眠问题时,我可以清楚地说明,不幸的是,此解决方案在此操作系统上不适用于此问题。可能是我,但这在windows 10中似乎不适用于Win 10@ecklerpa中的我。此外,如果有人需要为可见的应用程序执行此操作,请说明离子,还记得设置所需的ES_DISPLAY_,以避免显示器关闭。