我正在开发一个C#应用程序,它在后台运行,没有任何Windows控件。
我想通知Windows我的应用程序仍处于活动状态,以防止Windows进入空闲状态。
是否有任何API可以从我的应用程序调用,通知Windows操作系统我的应用程序仍然存在?
提前致谢。
答案 0 :(得分:35)
您必须使用SetThreadExecutionState功能。像这样:
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;
}
答案 1 :(得分:18)
您有几个选择:
使用SetThreadExecutionState,其中:
允许应用程序通知系统它正在使用中,从而防止系统在应用程序运行时进入睡眠状态或关闭显示屏。
您可以使用ES_SYSTEM_REQUIRED
标志
通过重置系统空闲计时器强制系统处于工作状态。
使用SendInput伪造击键,鼠标移动/点击
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);
答案 2 :(得分:10)
您可以使用此处描述的SetThreadExecutionState
:
由于它是一个Win32 API函数,要从C#中使用它,你需要PInvoke它。这里描述了这些步骤,包括暂时禁用睡眠模式的示例方法PreventSleep
:
答案 3 :(得分:0)
我认为没有办法直接在托管代码中执行此操作。
快速搜索显示2年前的this帖子。基本上你需要做一些互操作来调用原始的Windows API。
答案 4 :(得分:0)
这是SetThreadExecutionState
C#实现