C#调用API实现定时关机这两天用C#写了个用于定时关机的小程序,该简单程序由两个层次构成,即底层逻辑和用户界面两部分。怕忘了当中一些细节,于是把它记录下来。一、程序逻辑设计——API调用事实上,可以直接调用系统的shutdown.exe来实现计算机的关闭、重启和用户注销。常见的用法如下:usingSystem.Dinogistics;//引用该空间按钮click事件System.Dinogistics.Processp=newProcess();p.StartInfo.FileName=cmd.exe;p.StartInfo.UseShellExecute=false;p.StartInfo.RedirectStandardInput=true;p.StartInfo.RedirectStandardOutput=true;p.StartInfo.CreateNoWindow=true;p.Start();p.StandardInput.WriteLine(shutdown-s-t0);p.StandardInput.WriteLine(exit);p.close();但这里,我用了调用API的方法,用于系统的关闭与重启,并将参考网络的一些API调用封装成一个类库——SystemControl.dll。下面,调用user32.dll中的关机方法,该方法是本程序的关键。[DllImport(user32.dll,EntryPoint=ExitWindowsEx,CharSet=CharSet.Ansi)]privatestaticexternintExitWindowsEx(intuFlags,intdwReserved);对上述函数进行封装,使其更易懂,可得:protectedstaticvoidExitWindows(inthow,boolforce){EnableToken(SeShutdownPrivilege);if(force)how=how|EWX_FORCE;if(ExitWindowsEx(how,0)==0)thrownewPrivilegeException(FormatError(Marshal.GetLastWin32Error()));}其中EnableToken用于使能优先级令牌,PrivilegeException是定义的优先级异常。以上述方法为基础,可以得到这样一个公共方法。publicstaticvoidExitWindows(RestartOptionshow,boolforce){switch(how){caseRestartOptions.Suspend:SuspendSystem(false,force);break;caseRestartOptions.Hibernate:SuspendSystem(true,force);break;default:ExitWindows((int)how,force);break;}}该方法除定义了关机功能外,还包括了挂起、休眠等选项。当然,如果对上述设计进行精简,也就是忽略异常抛出等一系列功能,我们可以将整个过程简化:publicstaticvoidExitWindows(){ExitWindowsEx(0,0);}其中,ExitWindowsEx就是前面的API引用。二、界面设计程序运行界面如图1所示:图1程序运行界面2.1Timer的应用该程序有三个地方用到计时器,第一个是状态栏的时钟显示,一个是关机剩余时间显示,还有一个就是定时关机的倒计时。状态栏的时钟每秒刷新一次,刷新方法如下:privatevoidTimeStatusRefresh(objectsender,EventArgse){timeStatusLabel.Text=DateTime.Now.ToString();}计时器的Interval属性是计时的周期,即执行完Interval指定的时间后,触发所指向的方法,该方法触发后,计时器重新计时,经过指定时间后再次触发,如此循环……当然,如果是关机的话,就不循环了……“黄鹤一去不复返”啊。其设定如下:////statusTimer//this.statusTimer.Enabled=true;this.statusTimer.Interval=1000;this.statusTimer.Tick+=newSystem.EventHandler(this.TimeStatusRefresh);其余计时器也是类似的。2.2DateTimePicker的用户自定义格式DateTimePicker控件的格式可以由用户自己进行定义,比如图1所示的格式,可以这样进行定义(其中HH是24小时的小时显示,12小时为hh):this.dateTimePicker1.CustomFormat=yyyy年MM月dd日HH:mm:ss;一开始,我们禁能了该控件,当选中其前面的RadioButton时,该控件使能。2.3NotifyIcon——将窗口隐藏到系统托盘中去首先,我们定义隐藏的方法,这里,我们把窗口及其任务栏显示一并隐藏。该方法与窗体的resize事件关联,由于在最小化时隐藏,而其它改变大小的情况并不隐藏,所以,一开始就判断是否点击了最小化按钮。privatevoidHideForm(objectsender,EventArgse){if(this.WindowState==FormWindowState.Minimized){//不在任务栏中显示。this.ShowInTaskbar=false;//设定为不可见,这两项也可以用this.hide()实现。this.Visible=false;}}其复原的方法定义如下:///summary///显示窗口。///para双击托盘图标或选中打开程序时发生,显示该程序。/para////summary///paramname=sender/param///paramname=e/paramprivatevoidShowForm(objectsender,EventArgse){this.Visible=true;this.ShowInTaskbar=true;//把窗口设定为常规大小。this.WindowState=FormWindowState.Normal;}程序隐藏效果见图2,沙漏图标表示该程序。双击该图标,可以重新显示程序运行窗口。图2系统托盘显示2.4托盘图标上的ContextMenuStrip要做到右击托盘图标就可以打开或者关闭该软件,需要增加一个ContextMenuStrip,该控件的使用不难,关键是别忘了与NotifyIcon关联起来。////contextMenuStrip1//this.contextMenuStrip1.Items.AddRange(newSystem.Windows.Forms.ToolStripItem[]{this.openToolStripMenuItem,this.EndToolStripMenuItem});this.contextMenuStrip1.Name=contextMenuStrip1;this.contextMenuStrip1.Size=newSystem.Drawing.Size(137,48);////openToolStripMenuItem//this.openToolStripMenuItem.Name=openToolStripMenuItem;this.openToolStripMenuItem.Size=newSystem.Drawing.Size(136,22);this.openToolStripMenuItem.Text=打开控制器;this.openToolStripMenuItem.Click+=newSystem.EventHandler(this.openToolStripMenuItem_Click);////EndToolStripMenuItem//this.EndToolStripMenuItem.Name=EndToolStripMenuItem;this.EndToolStripMenuItem.Size=newSystem.Drawing.Size(136,22);this.EndToolStripMenuItem.Text=结束程序;this.EndToolStripMenuItem.Click+=newSystem.EventHandler(this.EndToolStripMenuItem_Click);2.5ToolTips提供悬停帮助ToolTips可以给组件提供帮助信息,如关机按钮,可以通过ToolTips显示该按钮的功能。将ToolTips拖放到窗口上,即在各个控件中插入了设置提示的功能。2.6Buttons功能分配按钮的事件设计大体相同,以重启按钮为例,其效果如图3所示:图3重启对话框按下重启按钮,则出现如图3所示的对话框,重启代码如下:privatevoidbtnRestart_Click(objectsender,EventArgse){if((MessageBox.Show(确实要重启计算机?,重启系统,MessageBoxButtons.YesNo,MessageBoxIcon.Question))==DialogResult.Yes){WindowsController.ExitWindows(RestartOptions.Reboot,false);}}一开始,程序禁能了一些按钮,如定时关机按钮和停止按钮。当设定了关机时间后,定时关机按钮被激活,定时关机代码如下:privatevoidbtnWaitShut_Click(objectsender,EventArgse){DisableBtns();btnStop.Enabled=true;btnWaitShut.Enabled=false;if(radioButtonSetTime.Checked){numOfSec=(int)(dateTimePicker1.Value-DateTime.Now).TotalSeconds;}else{numOfSec=(int)(numericUpDownMin.Value*60+numericUpDownSec.Value);}lblTips.Text=开始倒计时...;lblTips.Text=离关机还剩+numOfSec+秒!;lblTips.Visible=true;//剩余时间提示计时器开始计时。showTimer.Enabled=true;//设定关机时间。waitTimer.Interval=1000*numOfSec;//关机计时。waitTimer.Enabled=true;}按下定时关机按钮,则立即关机、重启、注销以及定时关机等4个按钮被禁止,停止按钮被激活。按下停止按钮,则关机倒计时被停止。privatevoidbtnStop_Click(objectsender,EventArgse){EnableBtns();btnStop.Enabled=false;btnWaitShut.Enabled=true;showTimer.Enabled=false;lblTips.Visible=false;numOfSec=int.MaxValue;waitTimer.Enabled=false;}3.小结该小软件是本人作定时关机和看时间之用,也是对API调用及Timer窗体控件的学习,其中,Timer类还见于System.Threading命名空间中,具体的使用可参考msdn。该小程序是我在空余时间写出来的,由于缺乏深思,谬误之处在所难免,以上是我的两个常用邮箱,希望大家多多指教。
本文标题:C控件属性事件大全
链接地址:https://www.777doc.com/doc-2908552 .html