阻止系统自动睡眠的小软件,附C#制作过程

原文 http://www.cnblogs.com/h46incon/p/SleepPreventer.html

因为有时下载东西的时候,不想让电脑自动深入睡眠,所以就开启了离开模式。这样不但不节能环保,而且到真正想要睡眠的时候就是一翻蛋疼。

改过自新,关闭了离开模式,同时无操作30分钟后也会进入睡眠模式。但是在下载的时候怎么办呢?反正也是闲着,就写了这东西:

增加了合上盖子时保持唤醒功能,截图懒得换了。

 

第一张是主界面,最小化时会隐藏窗口。后面的是托盘的菜单,托盘会根据不同的设置选择不同的图标。

其中,开启离开模式不需要修改注册表,自然的,也就在软件开着的时候有效。监控模式则是每隔半分钟,就将本次设置告知系统。为啥需要这个选项呢?往后看看实现就知道了。(嗯,发现其实不用这个选项的)

程序在最后面。

 



下面是实现(其实写这个程序的目的之一就是为了学习C#……):

(所谓的)核心代码是调用这个API ( MSDN的介绍) :


1

2

3

EXECUTION_STATE WINAPI SetThreadExecutionState(

  _In_  EXECUTION_STATE esFlags

);

这个API作用是允许程序通知系统在使用某些资源,以阻止系统进入睡眠或关闭显示器。

参数esFlags是以下选项的组合:ES_AWAYMODE_REQUIREDES_CONTINUOUSES_DISPLAY_REQUIREDES_SYSTEM_REQUIRED

按字面意思理解选项即可。其中ES_CONTINUOUS表示在下一次调用该API前,本次设置会一直生效。所以在大部分情况下,加上这个选项的话,只需调用一次API即可。但考虑到可能有别的程序也在调用这个API,因而让本程序的设置失效,所以有了监控模式:每隔一断时间就将设置通知系统。(这个API是针对每个线程而言的,只要这个线程不退出,和CONTINUOUS一起设置的选项就会一直生效)。

若是单独使用ES_CONTINUOUS选项,则会恢复睡眠策略。

 

C# 怎么使用Win32API呢?


1

2

3

4

5

6

7

8

9

using System.Runtime.InteropServices;

// 按照API原型,将类型转换C#的类型声明即可

[DllImport("kernel32.dll")]

static extern uint SetThreadExecutionState(uint esFlags);

// 选项所用到的常数

const uint ES_AWAYMODE_REQUIRED = 0x00000040;

const uint ES_CONTINUOUS = 0x80000000;

const uint ES_DISPLAY_REQUIRED = 0x00000002;

const uint ES_SYSTEM_REQUIRED = 0x00000001;

C#所有的方法变量都必须声明在一个类里。我把这些东西声明到一个叫Public的类。声明后,就可以直接调用该方法了。

 

(不知道起什么子标题……)

该程序可以通过主界面以及托盘弹出的菜单进行选择的设置,所以需要同步这两个地方的状态,Checkbox该自动打钩时打钩,该取消时取消等等。为了写代码时,不需要考虑这些东西,就抽象出了一个Option类(每次起名的时候就痛恨自己英文太差)。通过该类可以设置选项,同时也可以在里面注册一个委托,当选项有变时,会调用这些委托。同时,该类也会负责在设置选项时自动通知系统。注:在析构函数中,以参数ES_CONTINUOUS调用一次该API恢复原来的休眠配置。

 

主界面:

    主界面就是拉拉控件,处理下事件。注意,Checkbox的选项值可能会因为鼠标点击以外的原因改变,所以选择监听鼠标点击事件。为了处理事件时少粘贴点代码,我用一个Dictionary将 每个CheckBox和一个选项值绑定在一起。然后使用同一个事件处理函数,在函数里,根据sender确定是哪个Checkbox发送的,再根据那个 Dictionary确定需要设置什么样的值。 然后向Option类注册一个委托,在选项有变时改变Checkbox到正确的状态。

    最小化时直接隐藏窗口,而不是缩小的任务栏:可以选择监听Resize事件,在事件中判断窗体是不是处于最小化的状态,是的话就隐藏窗体。更彻底的是重载窗体类的消息处理函数,并自己处理最小化消息。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

protected override void WndProc(ref Message m)

{

    const int WM_SYSCOMMAND = 0x112;

    const int SC_CLOSE = 0xF060;

    const int SC_MINIMIZE = 0xF020;

    const int SC_MAXIMIZE = 0xF030;

    if (m.Msg == WM_SYSCOMMAND)

    {

        if (m.WParam.ToInt32() == SC_MINIMIZE)

        {

            this.Hide();

            return;

        }

    }

    base.WndProc(ref m);

}

 

托盘部分:

    托盘:使用NotifyIcon控件。注意,这个控件必须设置ICON才能显示。添加一个ContextMenuStrip对 象作为右键点击时的弹出菜单。为了让点击托盘时能弹出这个菜单,可以将托盘控件的ContextMenuStrip属性设置为该菜单即可。在这里因为我需 要监听鼠标事件,让左键点击时显示主窗口,我就在事件处理函数中顺便处理右键点击了。如果是右键点击,则调用该菜单的Show方法就可以了。

    然后是菜单的内容。新建若干ToolStripMenuItem对象,并用ContextMenuStrip.Items.Add(…)方法将这些Item添加进菜单即可。每个Item可以监听鼠标点击事件,同时也可以通过设置它的Checked属性来显示item文本前的小钩钩。需要分割线的话添加ToolStripSeparator对象就可以了。

    动态的托盘图标:为了少写点什么读取文件之类的代码,就直接把托盘图标添加进程序的资源文件里了。方法是在项目的属性里选择资源,然后就可以添加想要的资源了。需要访问这些资源时,在myProject.Properties.Resources里就可以访问了。如:System.Drawing.Bitmap bitmap1 = myProject.Properties.Resources.Image01(参考MSDN)。最后再根据选项的状态选择相应的图标即可。

    托盘消失:直接执行Application.Exit()的话,托盘不会自动消失,得鼠标从托盘上面滑过才可以。为了让托盘显示,执行NotifyIcon对象的Dispose( )方法就好了。

 

让程序开始运行时只显示托盘,而不显示主窗体。放狗搜索的时候发现这个问题让很多新手喝了一壶。我的解决方法是:让程序开始是不运行主窗体的代码,只运行托盘控件的代码。转到Main函数,发现Main函数最后执行的是 Application.Run(…) 这个方法。最开始尝试在这个方法的参数里填入一个NotifyIcon对象,但是不行。然后试着直接用new新建一个NotifyIcon对象,这个时候托盘是会显示出来,但是程序马上就会退出了。最后发现这个方法有个无参重载版本,执行后程序就不会退出了……

 

生成的EXE的图标:在项目的属性里,选择应用程序选项卡,就可以设置图标了。



睡眠终结者:http://files.cnblogs.com/h46incon/SleepPreventer.zip

时间: 2024-10-03 13:56:53

阻止系统自动睡眠的小软件,附C#制作过程的相关文章

Windows7系统自动更新导致系统盘空间变小的解决办法

Windows系统的更新程序是微软提供的一种自动更新工具,通常提供漏洞.驱动.软件的升级.而Windows系统正版与盗版的重要区别之一就是更新程序,盗版的Windows系统如果自动更新,很快就会被微软识别出来,最新的Windows7系统在盗版问题,微软将对正版Windows7系统内置反盗版激活程序,可见微软对Windows7系统自动更新程序上费了更多的精力. 本文介绍下正版Windows7系统在自动更新时出现的问题,Windows7系统自动更新导致系统盘空间变小的解决办法,Windows7 在自

阻止Win7系统自动安装驱动程序的3种方法

阻止Windows7系统自动安装驱动程序的3种方法: 方法1:[开始]-[设备与打印机],或如下图到控制面板里找 右键计算机图标,选择[设备安装设置] 在弹出的窗口选否,选法和方法一相同 方法2:右键桌面上的[计算机]-[属性] 选择左边选项卡的[高级系统设置],切换到[硬件]选项卡,选择第二个[设备安装设置] 在弹出的窗口里选择[否] 选择第三个[从不安装来自Windows Update安装](也就是上图序号2),这样就可以完全阻止了,但是软媒小编建议选择第二项(也就是上图蓝色框1),这样可以

阻止Windows8系统自动清理缩略图信息的方法

在Windows8系统新式的用户界面以及针对平板电脑的优化给用户留下的深刻的印象.实际上,Windows8也使用了新的网络设置,个性化管理,系统登录以及系统安全的相关选项.同之前版本的Windows系统相同的是,Windows8严格地管理用户使用权限以防止用户对系统的默认设置进行随意修改.几乎所有的特殊文件,包括用户的配置文件.system32文件以及库文件夹等等都被系统指定了权限. 系统允许它们增添与访问文件,修改扩展文件的属性,删除文件夹以及子文件夹,从文件夹中清理垃圾文件.Explorer

win8.1系统在高分辨率屏幕下禁止软件自动缩放比例的方法

  win8.1系统在高分辨率屏幕下禁止软件自动缩放比例的方法?win8.1系统拥有贴心.人性化的设计,比如软件会自动缩放比例,这有什么作用呢?Win8.1系统中的软件会自动缩放比例,以适应屏幕显示,看起来更加清晰.但是如果win8.1系统分辨率已经够好,那就没必要软件缩放了,不然会导致屏幕变得不清晰.所以本教程分享就是win8.1系统在高分辨率屏幕下禁止软件自动缩放比例的方法,感兴趣的用户可以往下学习. 具体方法如下: 1.对着桌面软件图标,单击鼠标右键,菜单中选择"属性"; 2.在

8 1 自动路测-WIN8.1系统下无法正常打开自动路测回放软件的工作空间

问题描述 WIN8.1系统下无法正常打开自动路测回放软件的工作空间 有关调用实时(JIT)调试而不是此对话框的详细信息, 请参见此消息的结尾. ************** 异常文本 ************** System.IO.FileNotFoundException: 未能加载文件或程序集"MapInfo.CoreTypes, Version=6.8.0.536, Culture=neutral, PublicKeyToken=f548bcba69d4b8da"或它的某一个依

怎么阻止Win7自动安装驱动程序

使用win7系统的很多人不喜欢系统自动安装驱动程序,这时我们应该怎么处理呢?下面就来看看具体操作方法吧. 按一下开始按钮,在开始搜索框中键入"设备和打印机",然后单击打开. 这个窗口中包含了所有连接到当前计算机上的设备.包括显示器.键盘.鼠标.打印机等等. 把鼠标定位到代表计算机的图标上. 注意,图标的名称并不是我们常见的"计算机",而是计算机在网络中的全名.要是不清楚计算机名,请打开开始菜单,然后右击"计算机",选择"属性"

Windows7系统自动安装驱动程序的关闭方法

Windows7系统自动安装驱动程序的关闭方法 : 1. 按一下开始按钮,在开始搜索框中键入"设备和打印机",然后单击打开. 2. 这个窗口中包含了所有连接到当前计算机上的设备.包括显示器.键盘.鼠标.打印机等等. 把鼠标定位到代表计算机的图标上. [注意,图标的名称并不是我们常见的"计算机",而是计算机在网络中的全名.要是不清楚计算机名,请打开开始菜单,然后右击"计算机",选择"属性".在系统窗口可以看到详细信息.]回到正题

WinXP系统自动待机怎么办

  WinXP系统自动待机怎么办           1.该问题应该是硬件与软件之间兼容的问题,具体地说应该是操作系统没有正确识别主板,建议重装操作系统,并重装主板驱动程序,一般问题就能解决. 2.再者就是必须要确定主板是否是新的,而且是没有任何小毛病的新主板,为什么这么说呢?因为市面上很多都是卖维修好的二手主板,对于不懂电脑的新手来说.被骗了也是正常的.

怎么关闭Win7系统自动更新

  怎么关闭Win7系统自动更新 1.在任意位置新建一个文本文档; 2.打开新建的文本文档,将下面这段代码复制进去: @echo off disable the win7 auto running netsh interface tcp set global rss=disabled netsh interface tcp set global autorunning level=disabled 2.点击左上角的"文件"-"另存为",在保存界面首先选择好文件保存位