Winapi 使用SetThreadExecutionState恢复默认设置后,系统不休眠
我创建了一个方法来防止系统睡眠,如下所示:Winapi 使用SetThreadExecutionState恢复默认设置后,系统不休眠,winapi,c#-4.0,timer,pinvoke,Winapi,C# 4.0,Timer,Pinvoke,我创建了一个方法来防止系统睡眠,如下所示: public static void KeepSystemAwake(bool bEnable) { if (bEnable) { EXECUTION_STATE state = SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
public static void KeepSystemAwake(bool bEnable)
{
if (bEnable)
{
EXECUTION_STATE state = SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
}
else
{
EXECUTION_STATE state = SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);
}
}
该方法防止系统睡眠,但当我调用该方法的ES_CONTINUOUS部分时,当我希望系统正常运行时,系统根本不睡眠。我错过了什么?我正在另一个线程(计时器)中运行此代码
我正在另一个线程(计时器)中运行此代码
如果您使用的是类似于System.Threading.Timer
的回调函数,它将在不同(读取:任意)线程上被调用
发件人:
计时器执行的回调方法应该是可重入的,因为它是在线程池线程上调用的
确保您正在为同一线程调用
SetThreadExecutionState
。理想情况下,您将对一个线程(如主线程)进行串行调用。当我希望系统正常运行时,系统根本不会休眠。假设您已经证明没有其他进程调用SetThreadExecutionState
来保持PC处于唤醒状态,对吗?是的。这只是我的申请。当我停止应用程序时,一切都恢复正常。我将尝试在应用程序的UI线程上运行SetThreadExecutionState,并让您知道:)您是对的。我确保SetThreadExecutionState只发生在一个线程上,现在它可以完美地工作。谢谢