如果使用C#运行,如何关闭Windows屏幕保护程序?

时间:2011-03-29 15:13:10

标签: c# windows windows-7 screensaver

好的,所以我找到了一些code来检查屏幕保护程序是否正在运行并在我想要的时候将其终止。这似乎不适用于Windows 7 PC。有谁知道如何修改此代码,或提供新代码来实现此目的?

我的应用程序旨在在后台运行,直到发生特定事件,然后创建并显示全屏通知。即使屏幕保护程序当前处于运行状态,也需要显示此内容。

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

以下问题可能会提供一些见解:

How to turn screensaver on (windows 7) by a code (in cmd)?

但是,如果机器被锁定怎么办?我认为你不能在锁定屏幕上显示任何应用程序,除非它实际上是一个屏幕保护程序(即使那时它可能也不可能)

答案 1 :(得分:2)

最简单的方法是通过调用SendInput()伪造x = y = 0的鼠标移动事件。

答案 2 :(得分:1)

假设您没有受密码保护的屏幕保护程序:(来自http://support.microsoft.com/kb/140723

PostMessage (GetActiveWindow(), WM_CLOSE, 0, 0L);

答案 3 :(得分:0)

使用 SetThreadExecutionState 这个winAPI来告诉操作系统该线程正在使用中,即使用户没有与计算机进行交互。这些将防止出现屏幕保护程序并阻止机器自动挂起。

使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入睡眠状态或关闭显示器。

有一系列标志可以为当前线程指定新状态:

  • ES_AWAYMODE_REQUIRED(0x00000040):启用离开模式。
  • ES_DISPLAY_REQUIRED(0x00000002):通过重置显示器空闲计时器来强制显示器开启。
  • ES_SYSTEM_REQUIRED(0x00000001):通过重置系统空闲计时器来强制系统进入工作状态。
  • ES_CONTINUOUS(0x80000000):通知系统所设置的状态应保持有效,直到使用ES_CONTINUOUS的下一个调用和其他状态标志之一被清除为止。

由于这是一个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
//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

根据MSDN,此API可以安全使用。

系统维护着称为SetThreadExecutionState的应用程序的数量。系统跟踪每个调用SetThreadExecutionState的线程,并相应地调整计数器。如果该计数器达到零,并且没有任何用户输入,则系统进入睡眠状态。

如果应用程序在重置标志前崩溃,系统将进行调整并自动重置。