如何在屏幕保护程序运行时停止它?而不用移动鼠标或按键盘上的键。我的应用程序输入来自读卡器,如果屏幕保护程序正在运行,我的应用程序仍然可以正常运行,但是当在读卡器上收到输入时,屏幕保护程序不会停止。
我已经尝试过此http://www.codeproject.com/Articles/17067/Controlling-The-Screen-Saver-With-C,但似乎不适用于我。
[我尝试在此线程How do I turn off the windows screen saver if it is running using C#?上伪造鼠标移动,并且如线程中所述,它似乎在Windows 8上不起作用(我在Windows 8.1上运行)。
我什至尝试过SendKeys
。
我看到的其他大多数问题/示例都是我不想停止的屏幕保护程序。如果读卡器中有输入,我希望屏幕保护程序启动和停止。
使用SetThreadExecutionState此winAPI可以告诉操作系统该线程正在使用中,即使用户没有与计算机进行交互。这些将防止出现屏幕保护程序并阻止机器自动挂起。
使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入睡眠状态或关闭显示器。
有一系列标志可以为当前线程指定新状态:
由于这是一个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