最近看了下电脑管家里面修复漏洞时阻止系统进入待机模式的实现,其实很简单,哈哈。可以看一下这个MSDN上对这个API的说明:http://msdn.microsoft.com/en-us/library/aa373208(v=vs.85).aspx

以下是转载

-----------------------------------------------------------------------------------------------

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

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

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

  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),但是不能阻止屏保的运行。代码如下:

  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真的很神奇,值得日后好好研究。

http://blog.csdn.net/magictong/article/details/6560634

阻止屏保运行、显示器和系统待机(使用SystemParametersInfo和SetThreadExecutionState两种办法)的更多相关文章

  1. Windows和Ubuntu双系统,修复UEFI引导的两种办法

    查看ubuntu是否是从 efi/uefi 启动的方法:  若 /sys/firmware/efi 存在则是,否则不是.shell命令: [ -d /sys/firmware/efi ] && ...

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

    原文http://www.cnblogs.com/TianFang/archive/2012/10/12/2721883.html 最近写了一个下载程序,发现有一个问题:挂机下载的时候,下载任务会因为 ...

  3. Android中实现全屏、无标题栏的两种办法(另附Android系统自带样式的解释)

    在进行UI设计时,我们经常需要将屏幕设置成无标题栏或者全屏.要实现起来也非常简单,主要有两种方法:配置xml文件和编写代码设置. 1.在xml文件中进行配置 在项目的清单文件AndroidManife ...

  4. Android中实现全屏、无标题栏的两种办法

    在进行UI设计时,我们经常需要将屏幕设置成无标题栏或者全屏.要实现起来也非常简单,主要有两种方法:配置xml文件和编写代码设置. 1.在xml文件中进行配置 在项目的清单文件AndroidManife ...

  5. win7系统不能用telnet命令的两种解决方法

    电脑专业人员对telnet命令都不陌生了,Telnet当成一种通信协议,在日常工作中,经常面对网络问题的人都会用到telnet命令,因为简单有效,可以帮助更快的找出问题.要是在使用过程中碰到win7纯 ...

  6. 取消Debian屏保及显示器休眠

    在产品展示场合,屏保及休眠会带来不好的体验,很多时候需要关闭掉. dpms显示器休眠设置: 开启:$ sudo xset dpms 1 1 2取消:$ sudo xset -dpms xset设置屏保 ...

  7. linux系统的磁盘空间限制的两种方法

    最近在搞VPS,要用到磁盘的限额,在网上找了一些相关的资料,总结起来,有两个方法能实现,一是用quota,另外一种是限制目录大小,下面我就将这两种方法写出来,与大家一起分享! 首先我们来看第一种方法, ...

  8. Oozie与Coordinator调度讲解及系统时区配置与定时触发两种配置方式

    1:修改本地linux时区 查看时区 - 号代表西  + 号 代表东 北京时间是东八区 设置时区的配置文件所在位置 cd /usr/share/zoneinfo/ 选择以亚洲的上海 的时区为基址 删除 ...

  9. 实现手机端上下左右滑屏的jq原生代码和使用库·两种办法

    先来一个原生的.我使用的是jq. 需要注意的地方就是被触发的元素最好不要是body,这个代码也可以修改,如果obj传进来的是body那么,$(this)必须是你的监听元素,不然会冒泡泡,整个项目就…… ...

随机推荐

  1. Hexo里如何添加广告

    前期先用Hexo做个人网站,模板可以用https://github.com/828768/maupassant-hexo,关于如何加入广告,可以看一下https://sobaigu.com/hexo- ...

  2. gdal库中设置prj4库全路径的用法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 gdal库实现投影转换之类的功能实际上底层都是调用prj4库的功能.如果gdal使用非静态的方式集成prj4库,实际上 ...

  3. Delphi2010,DelphiXE 安装控件找不到DesignIntf 解决办法

    今天安装了一个可以支持IP 地址输入的edit控件,安装后可以放到窗体上,但是编译提示找不到DesignIntf,DesignEditors 从Delphi6开始,就对DesignIntf,Desig ...

  4. WPF 设置了阴影效果后,Y轴位置会有变化的问题

    原文:WPF 设置了阴影效果后,Y轴位置会有变化的问题 背景 最近遇到一个动画执行时,文本位置变化的问题.如下图: 如果你仔细看的话,当星星变小时,文本往下降了几个像素. 貌似有点莫名其妙,因为控件之 ...

  5. VS2010中新控件的编程------颜色按钮类和颜色对话框

    (1)      颜色按钮类和颜色对话框 1) 颜色对话框 MFC提供了颜色对话框类CMFCColorDialog进行颜色的选择,系统可以利用DoModal()调用,然后选择相应的颜色. CMFCCo ...

  6. 6 Wcf使用Stream传输

    1.创建service和client项目 service项目新建wcf服务文件 MediaService 和 IMediaService IMediaService 代码为 using System. ...

  7. Cocos2d-X之LUA注意事项

    「使用计时器」: 计时器函数原型:unsigned int scheduleScriptFunc(unsigned int handler, float interval, bool paused) ...

  8. OpenCV实现朴素贝叶斯分类器诊断病情

    贝叶斯定理由英国数学家托马斯.贝叶斯(Thomas Baves)在1763提出,因此得名贝叶斯定理.贝叶斯定理也称贝叶斯推理,是关于随机事件的条件概率的一则定理. 对于两个事件A和B,事件A发生则B也 ...

  9. WPF特效-实现弧形旋转轮播图

    原文:WPF特效-实现弧形旋转轮播图 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013224722/article/details/77004 ...

  10. 使用python3的base64编解码实现字符串的简易加密解密

    import base64 copyright = 'Copyright (c) 2012 Doucube Inc. All rights reserved.' def main(): #转成byte ...