阻止系统自动睡眠的小软件,附C#制作进度(执行SetThreadExecutionState API函数,让系统误判)

本篇章前提须要:在UE4上安装了Radiant
UI插件。借使没有安装,请找别的籍教师程(只怕是小编的任何的课程,如今正在写)。

因为有时下载东西的时候,不想让电脑自动深远睡眠,所以就打开了距离格局。那样不但不节约环境保护,而且到确实想要睡眠的时候就是一翻蛋疼。

起名,本课程的目标:商量怎么着从网页成分中调用蓝图中的内容:

回头,关闭了离开情势,同时无操作叁十三分钟后也会跻身睡眠格局。不过在下载的时候如何是好呢?反正也是闲着,就写了那东西:

第一步:

日增了合上盖猪时保持唤醒作用,截图懒得换了。

写二个网页,大致内容为:

起名 1起名 2起名 3起名 4

<!DOCTYPE html>
<html lang="en" class="no-js">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
        <meta name="viewport" content="width=device-width, initial-scale=1"> 
        <title>T</title>

        <!--Mark-->
        <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"><!--这个不是必要的,这个是bootstrap样式-->
        <!--an-->
        <script type="text/javascript" src="js/createjs-2015.11.26.min.js"></script><!--这个的必要性没有考究-->
        <!--an-->
        <script type="text/javascript" src="js/radiantui-null.js"></script><!--原来这个也是不必要的-->
        <!--Mark end-->

        <script type="text/javascript">
            function HW(){
                RadiantUI.TriggerEvent('HelloW');
            }
        </script>
    </head>
    <body>
        <button type="button" onclick="HW()">nihao</button>
    </body>
</html>

 

内部的马克所标明的始末请留心,不必然都须要的!可是注意个中的radiantui-null.js是必需的【改良:已经证实这一个不用要了,能够漠视】,那么些文件假使没有写的话,请自己表明,因为它的情节非常短,如下:

首先张是主界面,最小化时会隐藏窗口。前面包车型客车是托盘的菜谱,托盘会依据不相同的安装选取差异的图标。

var RadiantUI;
if (!RadiantUI) {
    RadiantUI = {};
    RadiantUI.TriggerEvent = function() {}
    RadiantUI.SetCallback = function() {}
    RadiantUI.RemoveCallback = function() {}
}

个中,开启离开形式不需求修改注册表,自然的,也就在软件开着的时候使得。监察和控制格局则是每隔半分钟,就将本次设置告知系统。为啥须求那几个选项呢?现在看看达成就知道了。(嗯,发现实际上不用那几个选项的)

对的,先摆上去再说,createjs-二零一五.11.26.min.js那些文件能够搜一搜,以网络能源的格局包涵进来即可。逻辑上的剧情是越发按钮,按钮调用了HW()函数,而以此函数里的唯一一句代码是RadiantUI.Trigger伊夫nt(“HelloW”),那是指什么啊?先放一放。

程序在最后面。

 

 

在UE4中,声惠氏个RadiantUIElement


起名 5

上面是落到实处(其实写那一个顺序的指标之一正是为着学习C#……):

双击并在个中的url中写入那些html文件的相对地方(注意将以此文件放在合适的地点)。然后写上HelloW函数。

(所谓的)基本代码是调用那个API
( MSDN的介绍.aspx))

起名 6

1
2
3
EXECUTION_STATE WINAPI SetThreadExecutionState(
  _In_  EXECUTION_STATE esFlags
);

起名 7

那一个API功能是允许程序文告系统在行使一些能源,以阻止系统进入睡眠或关闭显示器。

新建三个RadiantHUD,然后绑上上述的这一个因素(笔者那里的起名是RUIElem_Lobby)

参数esFlags是以下选项的结缘:ES_AWAYMODE_REQUIRED, ES_CONTINUOUSES_DISPLAY_REQUIREDES_SYSTEM_REQUIRED

起名 8

按字面意思了然选项即可。个中ES_CONTINUOUS表示在下1遍调用该API前,此次设置会直接生效。所以在大部地方下,加上那些选项的话,只需调用一遍API即可。但考虑到恐怕有别的程序也在调用这几个API,因此让本程序的设置失效,所以有了监察和控制格局:每隔一断时间就将设置通告系统。(那个API是针对各种线程而言的,只要那个线程不脱离,和CONTINUOUS一起设置的选项就会间接生效)。

 起名 9

一旦单独行使ES_CONTINUOUS选项,则会过来睡眠策略。

最终放置在gamemode中,然后运维:

 

起名 10

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#有着的方法变量都必须注明在1个类里。笔者把这一个事物注脚到贰个叫Public的类。评释后,就足以直接调用该措施了。

 

 

(不精通起怎么着子标题……)

该程序可以经过主界面以及托盘弹出的菜谱进行抉择的设置,所以需求一块那五个地方的意况,Checkbox该机动打钩时打钩,该打消时撤消等等。为了写代码时,不需求考虑这几个东西,就悬空出了贰个Option类(每便起名的时候就痛恨本人英文太差)。通过此类能够安装选项,同时也得以在中间注册叁个信托,当选项有变时,会调用那个委托。同时,该类也会负担在安装选项时自动公告系统。注:在析构函数中,以参数ES_CONTINUOUS调用三遍该API苏醒原先的休眠配置。

 

主界面:

   
主界面正是拉拉控件,处理下事件。注意,Checkbox的选项值大概会因为鼠标点击以外的缘故改变,所以选取监听鼠标点击事件。为了处理事件时少粘贴点代码,作者用七个Dictionary将每一个CheckBox和3个选项值绑定在联合。然后利用同二个事件处理函数,在函数里,依照sender分明是哪些Checkbox发送的,再依照那3个Dictionary鲜明供给设置什么样的值。
然后向Option类注册3个寄托,在挑选有变时改变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.aspx))。最终再依据选项的情事选用相应的图标即可。

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

 

让程序开头运维时只呈现托盘,而不出示主窗体。放狗搜索的时候发现那一个难题让洋洋新手喝了一壶。小编的解决格局是:让程序起头是不运维主窗体的代码,只运转托盘控件的代码。转到Main函数,发现Main函数最终执行的是 Application.Run(…) 其一法子。最开始尝试在那么些办法的参数里填入2个NotifyIcon对象,不过充足。然后试着直接用new新建一个NotifyIcon对象,那一个时候托盘是会显得出来,可是程序及时就会脱离了。最终发现这么些艺术有个无参重载版本,执行后先后就不会脱离了……

 

生成的EXE的图标:在品种的性子里,选取应用程序选项卡,就能够安装图标了。


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

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图