好的,我找到了一些关于检测屏幕保护程序并在需要时关闭它的代码。但是,在Windows 7电脑上似乎无法正常工作。有人知道如何修改这段代码吗?或者提供新的代码来解决这个问题吗?
我的应用程序旨在在后台运行,直到发生特定事件,然后创建并显示全屏通知。即使当前正在运行屏幕保护程序,也需要显示此通知。
我的应用程序旨在在后台运行,直到发生特定事件,然后创建并显示全屏通知。即使当前正在运行屏幕保护程序,也需要显示此通知。
假设您没有密码保护的屏幕保护程序:(来自http://support.microsoft.com/kb/140723)
PostMessage (GetActiveWindow(), WM_CLOSE, 0, 0L);
使应用程序通知系统它正在使用,从而在应用程序运行时防止系统进入睡眠或关闭显示器。
有一系列的标志来指定当前线程的新状态:
因为这是WinAPI,所以你必须进行 PInvoke :
[DllImport("kernel32.dll", CharSet = CharSet.Auto,SetLastError = true)]
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
用户定义类型:
[FlagsAttribute]
public enum EXECUTION_STATE :uint
{
ES_AWAYMODE_REQUIRED = 0x00000040,
ES_CONTINUOUS = 0x80000000,
ES_DISPLAY_REQUIRED = 0x00000002,
ES_SYSTEM_REQUIRED = 0x00000001
}
这里是调用过程:
//To stop screen saver and monitor power off event
//You can combine several flags and specify multiple behaviors with a single call
SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
//To reset or allow those event again you have to call this API with only ES_CONTINUOUS
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);//This will reset as normal
系统会维护一个调用SetThreadExecutionState的应用程序计数器。系统会跟踪每个调用SetThreadExecutionState的线程并相应地调整计数器。如果该计数器达到零且没有任何用户输入,则系统进入睡眠状态。
如果应用程序在重置标志之前崩溃,系统将进行调整并自动重置。