确定,所以我找到了一些code来检查屏幕保护程序是否正在运行,并在需要时将其杀死。这似乎不适用于Windows 7 PC。有谁知道如何修改此代码,或提供新代码来实现此目的?
我的应用程序被设计为在后台运行,直到发生特定事件为止,然后创建并显示全屏通知。即使屏幕保护程序当前已启动,也需要显示它。
感谢您的帮助。
最简单的方法是通过调用SendInput()来伪造x = y = 0的鼠标移动事件。
以下问题可能提供一些见解:
How to turn screensaver on (windows 7) by a code (in cmd)?
但是,如果机器被锁定怎么办?我认为您无法在锁定屏幕上显示任何应用程序,除非它实际上是屏幕保护程序(即使那样也可能无法实现)
假设您没有受密码保护的屏幕保护程序:(来自http://support.microsoft.com/kb/140723)
PostMessage (GetActiveWindow(), WM_CLOSE, 0, 0L);
使用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
}
Here下面是调用过程:
//To stop screen saver and monitor power off event
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