【问题标题】:How do I turn off the windows screen saver if it is running using C#?如果使用 C# 运行 Windows 屏幕保护程序,如何关闭它?
【发布时间】:2011-07-25 09:24:58
【问题描述】:

好的,所以我找到了一些code 来检查屏幕保护程序是否正在运行,如果我愿意,可以将其关闭。这似乎不适用于 Windows 7 PC。有谁知道如何修改此代码,或提供新代码来完成此操作?

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

【问题讨论】:

  • 如果您想显示消息,但系统需要密码才能退出屏幕保护程序,会发生什么情况?希望你能充分控制有问题的机器,这不是问题,但它可能会破坏你的计划,我猜......
  • 不用担心。政策是这些盒子上没有密码。如果出于某种原因,如果弹出输入密码框,我不会不高兴。

标签: c# windows windows-7 screensaver


【解决方案1】:

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

【讨论】:

  • 这听起来很简单。我试试看。
  • 工作就像一个魅力。对于 .NET 世界中的用户:Cursor.Position = new System.Drawing.Point(0, 0);
  • 有趣的小解决方案,一定要记住这个! +1
  • 没有在 Windows 8 上佩戴。:(
【解决方案2】:

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

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

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

【讨论】:

  • 这适用于使用繁忙 PC 的商店员工。它不应该被锁定。如果是,那么我们将不得不处理它。现在我只需要杀死一个不受密码保护的屏幕保护程序。不过,我会检查这个问题。谢谢!
  • 如果我需要对屏幕保护程序施加更多控制,或者重新打开它,这很好……但我将把 David Heffernan 的回答标记为答案。一直在寻找简单、快速、有效的方法。谢谢!
  • 没问题,更多的是信息而不是完整的答案:)
【解决方案3】:

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

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

【讨论】:

  • 你读过这篇文章吗?该示例代码适用于 Windows 95。
  • @Mark:是的,我读过这篇文章,这就是为什么我知道适用于 Win95 的方法也适用于任何版本的 Windows(NT、2k 等),当屏幕保护程序没有时密码保护。由于 OP 说他们不会有密码,所以这种方法适用。
【解决方案4】:

使用 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 的每个线程并相应地调整计数器。如果此计数器达到零并且没有任何用户输入,则系统进入睡眠状态。

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

【讨论】:

    猜你喜欢
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2012-12-04
    相关资源
    最近更新 更多