阻止屏保运行、显示器和系统待机

原文 http://blog.csdn.net/zjerryj/article/details/4618485

   暴风影音在播放的时候会阻止屏幕保护程序的运行,并会防止系统关闭显示器和进入待机状态。以下就是用C#来实现这个功能。

1、阻止屏幕保护程序的运行

    基本原理是播放时调用Windows API函数SystemParametersInfo()来关闭屏幕保护程序,播放结束后再重新打开。代码如下:

[c-sharp] view plaincopy

  1. //定义API函数  
  2. [DllImport("user32.dll")]  
  3. static extern bool SystemParametersInfo(uint uiAction, bool uiParam, ref bool pvParam, uint fWinIni);  
  4. const uint SPI_GETSCREENSAVEACTIVE = 0x0010;  
  5. const uint SPI_SETSCREENSAVEACTIVE = 0x0011;  
  6. const uint SPIF_SENDCHANGE = 0x0002;  
  7. const uint SPIF_SENDWININICHANGE = SPIF_SENDCHANGE;  
  8. //调用,其中函数内的false才是起作用的设置,active变量是在读取设置的时候使用的,这里没有实际意义。  
  9. bool active = false;  
  10. SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, false, ref active, SPIF_SENDWININICHANGE);  

    C#调用Windows API还是很方便的,只是数据类型转换会比较麻烦,不过用得多了也就熟悉了。
    另外有一种情况是原本屏幕保护程序并没有打开。这可以通过SPI_GETSCREENSAVEACTIVE来获取最初的配置,最后还原即可。
    当然,要实现这个功能还有其他方法,比如窗体应用程序可以重写Form.WndProc()方法来截获系统消息SC_SCREENSAVE来终止屏保,或者用Windows Hook(钩子)技术来截获消息等。

2、防止系统关闭显示器或进入待机状态

    同样是调用Windows API函数,SetThreadExecutionState()。该函数可以重置系统的闲置时间(IdleTime),但是不能阻止屏保的运行。代码如下:

[c-sharp] view plaincopy

  1. //定义API函数  
  2. [DllImport("kernel32.dll")]  
  3. static extern uint SetThreadExecutionState(uint esFlags);  
  4. const uint ES_SYSTEM_REQUIRED = 0x00000001;  
  5. const uint ES_DISPLAY_REQUIRED = 0x00000002;  
  6. const uint ES_CONTINUOUS = 0x80000000;  
  7. //播放时调用  
  8. SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED);  
  9. //播放结束后调用  
  10. SetThreadExecutionState(ES_CONTINUOUS);  

    或者可以用一个System.Timers.Timer来定时调用SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED),看个人喜好吧。

    以上函数的具体用法可以参考MSDN。WindowsAPI真的很神奇,值得日后好好研究。

时间: 2024-08-30 23:42:26

阻止屏保运行、显示器和系统待机的相关文章

C#实现阻止关闭显示器和系统待机

原文http://www.cnblogs.com/TianFang/archive/2012/10/12/2721883.html 最近写了一个下载程序,发现有一个问题:挂机下载的时候,下载任务会因为系统休眠被终止掉. 最开始我的解决方法是关闭休眠,后来发现这种策略并不是很好:下载完成后,如果仍然继续保持开机状态浪费电. 因此,最好的方式是:在下载的时候阻止系统休眠.即不会因为休眠而终止下载任务,下载完成后自动转为休眠状态省电,都不用做下载完成后自动关机功能了. 查了一下相关文章,可以通过这个S

自己动手写屏保

屏保程序非常简单,它只是一个扩展名为".scr",全屏运行,并符合一定规则的应用程序,我们可以用任何语言来进行开发.屏保程序放置在系统的System32目录下面,被系统自动调用执行.当系统执行屏保程序时,它会要求带上一个不同的命令参数,以实现不同的功能,如正常运行,预览,设置等.我们只要在程序中为不同参数实现不同的功能,我们的程序就可以被系统正常地调用了.以下列出全部的命令参数及其意义: 命令行参数 意义详解 /s 正常运行屏保程序(到时间系统自动调用), 一般要求为接收到键盘事件时退

用C++Builder开发Windows屏保

摘要:本文通过一个具体的程序演示了Windows下的屏幕保护程序的实现过程. 一. 引言 视窗系统下的屏幕保护程序是一个基于命令行(Command Line)的应用程序.当屏保程序被调用时操作系统就用具体的命令行执行该程序.本文组织和处理了所有的命令行,包括"/p","/s","/c","/a",其中"/p"表示让屏保在预览窗口中显示:"/s"表示真正运行屏保:"/c"

Win7和Win8系统下笔记本无法实现自动待机屏保的解决方法

Win7和Win8系统的笔记本可以在菜单里手动点击进入睡眠.休眠的状态,但是无法自动进入睡眠.待机状态.屏保,电源选项中设置正常. 原因分析: 当开启演示模式后,电脑将保持唤醒的状态,此时电脑不会自动进入睡眠.休眠状态,屏幕亮度也不会自动降低也不会进入屏幕保护状态. 解决方案: 建议用Win+X 打开移动中心,将演示模式关闭即可. 备注: 1. 只有笔记本电脑才能调出移动中心,台式机并无移动中心 2. 开启演示模式后,任务栏右下角会出现一个投影仪状的图标

win7系统无法更改屏保怎么办?

  win7系统无法更改屏保怎么办? 1.单击一下桌面上的开始菜单,然后在ghost win7开始菜单中点击进入"运行",即可打开运行程序; 2.在运行程序中输入gpedit.msc,即可打开本地组策略编辑器.在左侧栏里面依次展开"用户配置"-"管理模板"-"控制面板"-"个性化"; 3.然后在win7个性化的右边窗口中查找到"阻止更改屏幕保护程序"一项,win7鼠标双击打开编辑窗口,在

win7系统下如何设置多元化屏保的方法

  屏幕保护是为了保护显示器而设计的一种专门的程序.当时设计的初衷是为了防止电脑因无人操作而使显示器长时间显示同一个画面,导致老化而缩短显示器寿命.另外,虽然屏幕保护并不是专门为省电而设计的,但一般Windows下的屏幕保护程序都比较暗,大幅度降低屏幕亮度,有一定的省电作用.现在咱们知道的屏保大都是显示一些图片或是气泡,有没有什么方法能够让咱们的屏保呈现多元化,让咱们的电脑缤纷一点呢?下面就和小编一起探究win7系统屏保怎么设置可以变得多元化的方法. win7系统设置多元化屏保的方法 1.大家可

一招搞定win7系统屏保程序

相信每一个Win7用户都接触过屏幕保护程序,屏保的作用就是当你电脑处于待机状态时,令屏幕自动进入保护状态,这样可以延长电脑的使用寿命,不过当我们看视频或者阅读小说时,由于鼠标键盘都没有动,常常看到入味时进入了屏保,这时候屏保反而帮了倒忙,那么有没方法关闭它呢?当然有. 普通的关闭方法大家可能都知道,就是通过桌面右键选择"个性化"设置,然后再将"屏幕保护程序"中的"等待时间"调为0,并将右侧的勾全取消掉.如果你之前也是这么设置的,那么你就会知道,这

Win7系统屏保功能启用不了怎么办?

Win7系统屏保功能启用不了怎么办? 1.按下"Win+R"组合键呼出运行,在框内输入"regedit"并按下回车键呼出注册表编辑器; 2.在注册表内依次展开"HKEY_CURRENT_USERControl Paneldesktop"; 3.在注册表右侧窗口找到"ScreenSaveActive"并且双击打开; 4.在编辑字符串界面将数值数据修改为"1"点击确定即可; 5.修改后若还不行,请按下"

win7系统观看电影会自动弹出屏保窗口怎么处理?

  win7系统观看电影会自动弹出屏保窗口怎么处理? 1.按"win+R"打开"运行"窗口,输入"gpedit.msc"命令后按回车,打开组策略编辑器窗口了; 2.在打开的组策略编辑器窗口中,依次点击展开"用户配置"--"管理模板"--"Windows组件"--Windows Media Player; 3.在右侧窗口中双击"允许允许屏幕保护程序"的选项,在弹出来的设