语言程序设计资料:WinForm项目实战(c_)定时关机_,媒体播放器,照片小管家,网络扫描器,俄罗斯方块,简易IE浏览器修复器_第1页
语言程序设计资料:WinForm项目实战(c_)定时关机_,媒体播放器,照片小管家,网络扫描器,俄罗斯方块,简易IE浏览器修复器_第2页
语言程序设计资料:WinForm项目实战(c_)定时关机_,媒体播放器,照片小管家,网络扫描器,俄罗斯方块,简易IE浏览器修复器_第3页
语言程序设计资料:WinForm项目实战(c_)定时关机_,媒体播放器,照片小管家,网络扫描器,俄罗斯方块,简易IE浏览器修复器_第4页
语言程序设计资料:WinForm项目实战(c_)定时关机_,媒体播放器,照片小管家,网络扫描器,俄罗斯方块,简易IE浏览器修复器_第5页
已阅读5页,还剩151页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、WinForm项目实战西安航空技术高等专科学校编著:计算机系 齐亚平 任静2009年12月前言本书专门为WinForm项目实战编写。以实例的方式讲解书中就涉及到的有关知识。所有项目均在.NET2005下调试通过。可以选作任意2个项目作为项目实战。西安航空技术高等专科学校齐亚平编写本书的第1、2、4章、任静编写第3、5章,李川、王建、赵琳、李中参与编写。 2010-1-18目录第1章 定时关机11.1 实例简介11.2 必备知识11.2.1 一个简单的API函数调用11.2.2 关机相关的API函数和导入方法21.2.3日期/时间DateTimePicker控件61.2.4 添加图标到系统托盘8

2、1.2.5计时器Timer控件101.3 项目实训设计思路121.3.1 设计思路121.3.2 界面设计121.3.3 调用API函数实现关机的基本流程131.4项目实训设计实现141.4.1 创建工程并完成相关设置141.4.2 添加ExitWindows类并完成类的设计171.4.3 AwokeForm提醒窗体的全部设计201.4.4 定时关机ShutDone主窗体的全部设计22小结26课后作业27第2章 媒体播放器292.1 实例简介292.2 必备知识292.2.1 OpenFileDialog292.2.2 Windows Media Player 控件312.2.3 TrackB

3、ar342.2.4 Process362.3 设计思路372.3.1 界面设计372.3.2播放器实现的基本原理382.4 设计实现382.4.1 WMP控件检测382.4.2 播放状态422.4.3播放控制432.4.4 获取媒体信息462.4.5 音量控制与进度条472.4.6 播放列表492.4.7 XP样式界面49小结50课后作业50第3章 照片小管家513.1 实例简介513.2 必备知识513.2.1 图片显示513.2.2 动态数组ArrayList的使用技巧533.2.3 TreeView与ArrayList配合使用533.2.4 图片的分类显示543.3 设计思路553.3.

4、1 界面设计553.3.2 程序实现的基本原理563.4 设计实现583.4.1 自定义存放图片信息的类583.4.2 添加所需的事件方法593.4.3 读取和保存图片的分类信息和图片信息593.4.4 添加图片分类61623.4.5 添加图片路径到一个图片分类中623.4.6 删除一个图片分类63653.4.7 删除一个路径信息653.4.8 图片显示6667小结67课后习题67第4章 网络扫描器694.1 实例简介694.2 必备知识694.2.1 System.Net.Sockets简介694.2.2 ListBox的内容自动上滚实现技巧704.2.3 端口简介704.2.4 线程简介7

5、14.3 设计思路734.3.1 界面设计734.3.2 特殊控件说明744.3.3 控件Timer744.3.4 控件ProgressBar744.4 设计实现754.4.1 动态线程实现754.4.2 IP与端口的遍历764.4.3 “开始” 按钮功能实现784.4.4 “停止”按钮功能实现814.4.5 “暂停”按钮功能实现824.4.6 计时功能82小结83课后习题83第5章 俄罗斯方块855.1 实例简介855.2 必备知识855.2.1二维数组855.2.2 Gdi+865.2.3随机数生成器875.2.4 PictureBox控件885.3 设计思路895.3.1 界面设计895

6、.3.2俄罗斯方块实现的基本原理905.4 设计实现905.4.1 游戏状态GameState枚举型905.4.2 方块类型BlockType枚举型915.4.3 基本正方形Square结构体915.4.4 俄罗斯方块类Block925.4.5 主游戏类TerisGame965.4.6 游戏主窗体101小结105课后作业105第6章 简易IE浏览器修复器1076.1实例简介1076.2必备知识1076.2.1 注册表基础1076.2.2 注册表基本操作1096.3 设计思路1106.3.1 界面设计1106.3.2 实现修改注册表立刻生效1126.3.3 在主窗体中修改从窗体属性。1126.4

7、 设计实现1126.4.1添加窗体所需的事件方法1136.4.2 修复原理窗体ShowMessage的代码设计1136.4.3主界面窗体Repair的代码设计114小结123课后作业123附录1 WinForm Control 命名规范125附录2常用注册表功能127第1章 定时关机知识点: API的基本概念和使用方法。 日期/时间DateTimePicker控件的使用方法。 系统托盘的编程。 计时器Timer控件的使用方法。本章编写说明:和其他章节比较,本章对操作的步骤有较为详细的说明,这是考虑到不同层次读者的需要。在其他章节有对操作步骤不太理解的地方,可参阅本章的内容。1.1 实例简介在许

8、多应用程序中都涉及到重启、或关机等功能,.NET 2003目前没有封装这些功能,利用API完成一个关机功能的程序以及对系统托盘的编程操作对许多应用程序是必需有的功能。本章将通过一个定时关机程序,详细描述实现过程。1.2 必备知识下面通过小例了解和掌握本章的知识点:1.2.1 一个简单的API函数调用1. API基础API(Application Programming Interface)是应用编程接口,是程序与处理器接口的命令集。Win32 API可以直接控制Microsoft Windows的核心(Win32代表为32位处理器开发的),是微软留给程序开发者直接控制Windows的接口。Wi

9、n32 API函数存放在动态链接库DLL文件中,常用的API在下面3个库中得以运行,分别是KERNEL32、USER32和GDI32。表1-1 API函数功能和动态链接库的关系Win32动态链接库文件名功能主要功能举例KERNEL32.DLL主要用于产生与操作系统之间的关联程序加载、上下文选择 ,文件输入输出, 内存管理USER32.DLL允许管理全部的用户接口窗口、 菜单 、对话框、图标等GDI32. DLL图形输出库“画”出窗口、菜单以及对话框等.NET 组件就是封装了相关的API,有些功能还没有封装,就需要程序开发者直接调用API;需要了解一些API调用的基本知识,下面通过一个实例了解如

10、何用.NET平台上的C#语言来调用Win32平台上的DLL文件。2. 通过API直接调用MessageBox(1) 创建一个名为“通过API直接调用MssageBox”的Windows应用程序项目(2) 添加一个Button按钮,采用默认属性值,其中Name属性值为button1(3) 需要引用外来库,所以必须导入一个Namespace:using System.Runtime.InteropServices;(4) 添加代码来声明一个API(在属性和字段定义的位置)DllImport(User32.dll) public static extern int MessageBox(int h,

11、 string m, string c, int type); 此处DllImport属性被用来从不可控代码中调用一方法。”User32. DLL”则设定了类库名。DllImport属性指定DLL的位置,这个DLL中包括调用的外部方法。Static修饰符则声明一个静态元素,而这个元素属于类型本身而不是上面指定的对象。extern则表示这个方法将在工程外部执行,使用DllImport导入的方法必须使用extern修饰符。MessageBox 则是函数名,拥有4个参数,其返回值为数字。(5) 添加button1的Click事件的处理方法,并添加代码如下:private void button1_C

12、lick(object sender, System.EventArgs e)MessageBox (0,显示的信息,API直接调用MessageBox,0);MessageBox 4个参数的含义如下:第一个:弹出的MessageBox的父窗口是谁。本例中没有,所以是0,也就是“空指针”。第二个:MessageBox的内容。本例中是“显示的信息”。第三个:MessageBox的标题。本例中是“API直接调用MessageBox”第四个:MessageBox上的按钮是什么,是0,只有一个确定(6) 运行程序,单击“button1”结果如图1-1所示图1-11.2.2 关机相关的API函数和导入方

13、法本小节涉及到了API函数的细节,需要一些相关的知识才能完全理解这些函数的作用。本小节的内容适合查阅使用。1. 自定义的结构体TokenPrivilegeLuid为了匹配API函数在调用时相互之间的传值的要求,需要自定义一个向非托管函数之间相互传递值的结构体。只有类具有固定的成员布局,就可以将类的成员传递给非托管的 DLL 函数。使用如下方法可以实现:StructLayout(LayoutKind.Sequential, Pack=1)StructLayout可以使数据依照程序设计者的意愿来排列或打包,LayoutKind.Sequential表示按照结构体定义的顺序排列数据 Pack = 1

14、表示结构体按一个字节对齐。结构体的名称为TokenPrivilegeLuid,其含义为“令牌权限Luid”,Luid 的含义为 locally unique identifier,是Windows系统保证局部唯一的标志,就是指在系统的每一次运行期间保证是唯一的值。结构体的定义如下:StructLayout(LayoutKind.Sequential, Pack=1) internal struct TokenPrivilegeLuid /确定权限数组元素的个数public int PrivilegesCount; /这里定义存放权限的Luidpublic long PrivilegesLuid

15、; /权限属性public int PrivilegesAttributes; 2. 获取当前进程句柄的函数函数名: GetCurrentProcess()参数:无返回类型:System.IntPtr,这里给出了在.C#.NET平台下对应的类型返回类型说明:为指针或句柄的特定类型,这里表示句柄类型对应类型后的函数为:IntPtr GetCurrentProcess()功能:获取当前进程的句柄3. 打开当前进程访问令牌的函数函数名: OpenProcessToken (HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)参

16、数1的含义:ProcessHandle是要修改访问权限的进程句柄参数1的类型:HANDLE,在C#.NET平台下对应的类型为System.IntPtr参数2的含义:DesiredAccess是要进行的操作类型,操作类型必须使用系统定义好的数值参数2的类型:DWORD,在C#.NET平台下对应的类型为System.Int32,也就是int类型参数3的含义:TokenHandle是返回的访问令牌句柄(指针)参数3的类型:PHANDLE,在C#.NET平台下对应的类型为System.IntPtr返回类型:bool 对应类型后的函数为:bool OpenProcessToken (IntPtr Pro

17、cessHandle, int DesiredAccess, IntPtr TokenHandle)功能:获取进程访问令牌的句柄4. 获取系统特定的权限值的函数函数名:LookupPrivilegeValue(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid)参数1的含义:lpSystemName是系统的名称,如果是本地系统只要指明为null参数1的类型:LPCTSTR,在C#.NET平台下对应的类型为string参数2的含义:lpName是权限的名称,具体名称已由系统定义,例如关机的权限名称是“SeShutdownPrivilege”参数2

18、的类型:LPCTSTR,在C#.NET平台下对应的类型为string参数3的含义:lpLuid是返回LUID的指针参数3的类型:PLUID,在C#.NET平台下对应的类型为 ref long返回类型:bool 对应类型后的函数为:bool LookupPrivilegeValue (string lpSystemName, string DesiredAccess, ref long TokenHandle)功能:获获取系统特定的权限值5. 调整访问令牌权限的函数函数名:AdjustTokenPrivileges (HANDLE TokenHandle, BOOL DisableAllPriv

19、ileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength)参数1的含义:TokenHandle是访问令牌的句柄参数1的类型:HANDLE,在.NET平台下对应的类型为System.IntPtr参数2的含义:DisableAllPrivileges是进行权限修改还是清除所有令牌权限,true为清除,false为修改权限参数2的类型:BOOL,在.NET平台下对应的类型为bool参数3的含义:NewState指明要修改的令牌权限参数3的类型

20、:PTOKEN_PRIVILEGES是一个结构体,在C#.NET平台下没有对应的类型,这里就要用到自定义的结构TokenPrivilegeLuid,具体为:ref TokenPrivilegeLuid参数4的含义:BufferLength是先前状态结构(PreviousState)的长度,如果PreviousState为空,其值为0参数4的类型:DWORD,在C#.NET平台下对应的类型为System.Int32,也就是int类型参数5的含义:PreviousState是一个指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息,可空参数5的类型:PTOKEN_PRIVIL

21、EGES,在C#.NET平台下对应的类型为System.IntPtr参数6的含义:ReturnLength为实际PreviousState结构返回的大小值的指针,如果PreviousState为空,这个参数也可以为空。参数6的类型:PDWORD,在C#.NET平台下对应的类型为System.IntPtr返回类型:bool 对应类型后的函数为:bool AdjustTokenPrivileges (IntPtr TokenHandle, bool DesiredAccess, ref TokenPrivilegeLuid NewState, int BufferLength, IntPtr Pr

22、eviousState, IntPtr ReturnLength)功能:调整访问令牌权限6. 关闭计算机的函数函数名:ExitWindowsEx (UINT uFlags,DWORD dwReason)参数1的含义:uFlags指定关机的类型,具体值代表的关闭原因已被系统定义好,例如0x00000000代表注销计算机,0x00000001代表关闭计算机,0x00000002代表重启计算机参数1的类型:UINT,在.NET平台下对应的类型为System.UInt16,若为int类型,其值必须为正数参数2的含义:dwReason是关闭原因,具体值代表的关闭原因已由系统已被系统定义好。例如0值代表无

23、原因关闭系统参数2的类型:DWORD,在.NET平台下对应的类型为System.Int32,也就是int类型返回类型:bool 对应类型后的函数为:bool ExitWindowsEx (int uFlags, int dwReason)功能:注销当前用户,关闭系统;或者关闭并重启7. 导入API函数的代码这里给出了在C#.NET平台下完整的导入API函数的代码/定义向非托管函数之间相互传递值的结构体,StructLayout(LayoutKind.Sequential, Pack=1) internal struct TokenPrivilegeLuid /确定权限数组元素的个数public

24、 int PrivilegesCount; /这里定义存放权限的Luidpublic long PrivilegesLuid; /权限属性public int PrivilegesAttributes; /导入获取当前进程句柄的函数。DllImport(kernel32.dll, ExactSpelling=true) internal static extern IntPtr GetCurrentProcess();/导入打开当前进程的访问令牌的函数DllImport(advapi32.dll, ExactSpelling=true, SetLastError=true) internal

25、static extern bool OpenProcessToken( IntPtr h, int acc, ref IntPtr phtok );/导入获取系统特定的权限值的函数DllImport(advapi32.dll, SetLastError=true) internal static extern bool LookupPrivilegeValue( string host, string name, ref long pluid ); /导入调整访问令牌权限的函数DllImport(advapi32.dll, ExactSpelling=true, SetLastError=t

26、rue) internal static extern bool AdjustTokenPrivileges( IntPtr htok, bool disall, ref TokenPrivilegeLuid newst, int len, IntPtr prev, IntPtr relen );/导入关闭计算机的函数DllImport(user32.dll, ExactSpelling=true, SetLastError=true) internal static extern bool ExitWindowsEx( int flags, int reason );1.2.3日期/时间Da

27、teTimePicker控件1. 确定存在DateTimePicker控件在“工具箱Windows 窗体” 区域中寻找DateTimePicker控件,如图1-2所示图1-22. 在“工具箱Windows 窗体”中添加DateTimePicker控件如果没有,按下面步骤添加:(1)在“Windows 窗体”中单击右键如 图1-3所示。图 1-3(2)单击“添加/移除项”如图1-4所示,确定DateTimePicker前面的复选框被选中。(3)单击“确定”按钮。图1-4(4)如果DateTimePicker前面的复选框被选中,而“Windows 窗体”中没有DateTimePicker控件,先将

28、DateTimePicker前面的复选框取消,按“确定”按钮,在做按步骤(1)、(2)和(3)再做一次。3. 添加DateTimePicker 控件添加2个DateTimePicker 控件,如图1-5所示图1-5设置控件属性:(1)上面的控件采用默认的属性(2)下面的控件属性设置如下:ShowUpDown为Ture,Format为Time。结果如图1-6所示。图1-61.2.4 添加图标到系统托盘 系统托盘就是任务栏状态通知区域的另一个称呼,一般情况下位于桌面右下角(任务栏最右面)。通常用于显示在后台运行的进程的图标,这些进程大部分时间不显示用户界面,像QQ、MSN等等程序,都有通知图标出现

29、在系统托盘中。通过下面一个实例了解如何添加一个图标到系统托盘的制作过程。功能描述:制作一个当窗口最小化时,关闭任务栏中的任务,在系统托盘中显示程序的图标,当双击系统托盘的图标时,还原窗口;对系统托盘的图标制作快捷(上下文)菜单,功能为“退出”和“打开窗体”。1. 创建工程创建一个名为“系统托盘”的Windows应用程序项目2. 拷入图标文件在计算机中搜寻扩展名为ico的图标文件,选择任意一个,拷入工程中。在本例中拷备的文件名为ICON2.ICO。3. 添加“NotifyIcon”控件在“工具箱”的“Windows 窗体”中选择“NotifyIcon”放入Form1的设计视图。属性采用默认值。“

30、Name”的默认值为notifyIcon1。设置notifyIcon1的“Icon”属性,选择拷入的图标文件,在本例中选择的是ICON2.ICO;设置“Visible”为False,开始的时候不显示系统托盘。4. 设定事件和处理方法设置窗体的大小改变的事件和处理方法,具体为:(1)选中设计视图,在“属性窗口”中选择“事件”按钮,寻找SizeChanged事件,如图1-7所示图1-7(2)双击 SizeChanged(3)添加事件处理的具体内容private void Form1_SizeChanged(object sender, EventArgs e)if(this.WindowState

31、=FormWindowState.Minimized)this. Visible= false;/窗体隐藏this.notifyIcon1.Visible=true;/系统托盘图标显示WindowState表示窗体状态,FormWindowState.Minimized表示最小化状态。5. 添加notifyIcon1的DoubleClick事件的处理方法(1) 选择notifyIcon1,在“属性窗口”中选择“事件”按钮,寻找DoubleClick事件(2) 双击DoubleClick(3) 在事件处理方法添加如下代码private void notifyIcon1_DoubleClick(o

32、bject sender, System.EventArgs e)this.Visible=true;/显示窗体this.WindowState=FormWindowState.Normal;/窗体状态为正常模式this.notifyIcon1.Visible=false;/隐藏系统托盘的图标6. 添加系统托盘图标的快捷(上下文)菜单(1)选中Form1窗体。(2) 在“工具箱”的“Windows 窗体”中选择“ContextMenu”放入Form1的设计视图,采用默认的Name属性值contextMenu1。(3) 在上下文菜单中建立“退出”对应的Name属性为menuItemExit,建立

33、“打开窗体”对应的Name属性为menuItemOpen。(4)添加menuItemExit和menuItemOpen的Click事件和处理方法(5) 给事件处理方法添加代码private void menuItemExit_Click(object sender, System.EventArgs e)this.Close();/关闭窗体private void menuItemOpen_Click(object sender, System.EventArgs e)this.Visible=true;/显示窗体this.WindowState=FormWindowState.Normal;

34、/设置窗体状态为正常模式this.notifyIcon1.Visible=false;/隐藏系统托盘的图标1.2.5计时器Timer控件在许多应用程序中都涉及到了计时器,在定时时间到后执行某一操作,使用Windows 窗体计时器组件Timer可以实现这类功能。下面通过一个实例了解这一过程的实现。实例功能描述:创建一个工程,在窗体的标题栏显示时间,每隔1秒钟刷新一次。1. 创建工程创建一个名为“计时器”的Windows应用程序项目2. 添加Timer控件从工具箱的“Windows 窗体”选项卡中将一个“Timer”(计时器)拖到Form1窗体中。Names属性采用默认值timer1,Interv

35、al 属性,值为1000(1秒)。说明:Interval 属性的单位为毫秒,属性的间隔可以在 1 和 64,767 之间,最长的间隔大约 64.8 秒。3. 启动计时器在Form1窗体加载事件处理程序中启动计时器(1) 双击Form1窗体,或在Form1属性窗口中选择“事件”按钮,双击Form1_Load。(2) 添加启动计时器的代码private void Form1_Load(object sender, System.EventArgs e)this.timer1.Start();/计时器启动4. 添加计时到后要进行的处理程序具体为Tick 事件和处理程序:(1)选中timer1,在“属

36、性窗口”中单击“事件”按钮,双击Tick。(2)添加事件的处理程序private void timer1_Tick(object sender, System.EventArgs e)this.Text=DateTime.Now.ToString();/当计时到后在窗体上显示日期和时间。5. 调试和运行程序结果如图1-8图1-8观察运行结果,窗体标题栏的时间每隔1秒钟刷新一次。6. 要注意的问题。(1) Interval 属性的值不可设置比需要的小很多,会增加系统的负担,(2) timer1_Tick(object sender, System.EventArgs e)事件处理在本例中是每秒运

37、行一次,本例只是一个示范代码,可以用其他功能的代码替换。(3)定时器的启动在本例中放到了Form1_Load(object sender, System.EventArgs e)中,这样做目的是为了简化实例。可以放到其他任何事件处理程序中。1.3 项目实训设计思路1.3.1 设计思路 调用API函数实现关机功能。在类中实现。 显示当前日期和时间。 使用DateTimePicker控件提供给用户设定日期和时间。 使用Timer控件实现定时。 实现启动定时关机选择方式的功能。 实现隐藏主界面到系统托盘的功能。 实现一分钟倒计时提醒方式的功能。 实现直接的关机、注销和重启方式的功能。1.3.2 界面

38、设计主界面设计:如图1-9所示。图1-9表1-2主界面控件名称对照表(按照界面从左到右,从上到下的循序排列)名称类型Text属性值Name属性值其他属性窗体Form定时关机ShutDone标签Label当前时间label1文本框TextBoxtxtDateTimeReadOnly=true标签Label设定关机时间label2日期/时间控件DateTimePickerdtpCurrentDate日期/时间控件DateTimePickerdtpCurrentTimeFormat=TimeShowUpDown=true复选框CheckBox启动定时关机chkStart按钮Button隐藏界面到系统

39、托盘btnHide分组控件GroupBox定时关机提醒方式gbxAwokType单选框RadioButton无rbtnNoneChecked = true单选框RadioButton一分钟倒计时rbtnOneMinute分组控件GroupBox直接操作gbxRightTpe按钮Button关机btnShutDone按钮Button注销btnReLogin按钮Button重启btnReBoot提醒界面设计:如图1-10所示图1-10表1-3提醒界面控件名称对照表(按照界面从左到右,从上到下的循序排列)名称类型Text属性值Name属性值其他属性窗体Form自动关机提示AwokeForm标签Lab

40、ellblMessage按钮Button取消自动关机btnCancel1.3.3 调用API函数实现关机的基本流程在Windows98下,只需要导入API函数调用,调用ExitWindowsE函数就可以进行关机等操作。但是在Windows2000和WindowsXP下,应用程序进程必须获取特权才能进行关机等操作。每一个进程的“访问令牌”存放了该进程的访问权限,获取特权并修改该进程的访问权限,是进行关机等操作的必要条件。图1-11是调用API函数实现关机的基本流程。图1-111.4项目实训设计实现 创建名称为“ShutDoneWindows”工程。 添加新窗体ShutDone和AwokeForm

41、。 在ShutDone窗体添加Timer控件、NotifyIcon和ContextMenu控件,并完成相关设置。 在AwokeForm窗体添加Timer控件,并完成相关设置。 添加名为ExitWindows的新类,并完成类的设计。 在ShutDone窗体实现关机程序、注销程序和重新启动。 完成AwokeForm窗体的全部设计。 完成ShutDone窗体的全部设计。1.4.1 创建工程并完成相关设置1. 创建ShutDoneWindows”工程并添加ShutDone和AwokeForm窗体首先创建名称为ShutDoneWindows的工程,在ShutDoneWindows项目中有一个默认的窗体F

42、orm1。在ShutDoneWindows项目添加新窗体名称ShutDone。在ShutDoneWindows项目添加新窗体名称AwokeForm。2. 拷贝程序入口点到ShutDone窗体并做适当调整(1)将Form1窗体的程序入口点内容拷入ShutDone窗体相应的位置。(2)Form1窗体拷贝的内容为:/ / 应用程序的主入口点。/ STAThreadstatic void Main() Application.Run(new Form1();(3)在ShutDone窗体粘贴并修改后的内容为:/ / 应用程序的主入口点。/ STAThreadstatic void Main() Appl

43、ication.Run(new ShutDone();(4)在ShutDoneWindows项目中删除Form1.cs。3. 完成ShutDone主窗体的界面设计参照图1-9和表1-2完成界面设计。4. 在ShutDone窗体添加Timer控件、NotifyIcon和ContextMenu控件在ShutDone窗体添加Timer控件、NotifyIcon和ContextMenu控件,属性设置如表1-4所示。表1-4 Timer、NotifyIcon和ContextMenu控件名称对照表名称类型Text属性值Name属性值其他属性计时器TimertmrMainClockInterval = 10

44、00通知图标NotifyIcon定时关机notifyIcon1Icon选择一个图标文件上下文菜单ContextMenucontextMenu1建立上下文菜单的具体内容,分2个子项,设置如表1-5。表1-5上下文菜单子项名称对照表名称类型Text属性值Name属性值其他属性上下文菜单子项1MenuItem显示主界面menuItemShowMainForm上下文菜单子项2MenuItem退出menuItemExit建立notifyIcon1和contextMenu1的联系。设置notifyIcon1的ContextMenu属性为contextMenu1。5. 添加ShutDone窗体所需的事件方法

45、选中对象,在“属性窗口”中选择“事件”按钮,双击事件名称,添加事件处理方法。需要添加的事件如表1-6所示:表1-6 ShutDone窗体所需的事件方法对象名称类型事件名称方法名称(是开发环境自动添加的)ShutDoneFormLoadShutDone_LoadbtnHideButtonClickbtnHide_ClickbtnShutDoneButtonClickbtnShutDone_ClickbtnReLoginButtonClickbtnReLogin_ClickbtnReBootButtonClickbtnReBoot_ClicktmrMainClockTimerTicktmrMain

46、Clock_TicknotifyIcon1NotifyIconDoubleClicknotifyIcon1_DoubleClickMenuItemShowMainForm上下文菜单的子项MenuItemClickmenuItemShowMainForm_ClickMenuItemExit上下文菜单的子项MenuItemClickmenuItemExit_Click6. 完成AwokeForm提醒窗体的界面设计参照图1-10和表1-3完成界面设计。7. 在AwokeForm窗体添加Timer控件在AwokeForm窗体添加Timer控件,属性设置如表1-7:表1-7 AwokeForm窗体Tim

47、er控件的属性设置名称类型Text属性值Name属性值其他属性计时器TimertmrMainClockInterval = 10008. 添加AwokeForm窗体所需的事件方法选中对象,在“属性窗口”中选择“事件”按钮,双击事件名称,添加事件处理方法。需要添加的事件如表1-8所示:表1-8 AwokeForm窗体所需的事件方法对象名称类型事件名称方法名称(是开发环境自动添加的)AwokeFormFormLoadAwokeForm_LoadAwokeFormFormClosingAwokeForm_ClosingbtnCancelButtonClickbtnCancel_ClicktmrClo

48、ckTimerTicktmrClock_Tick1.4.2 添加ExitWindows类并完成类的设计在类中实现调用API函数实现关机功能。添加一个名为ExitWindows的新类。完成类的编写,阅读下面的程序时可查阅“1.2.2 关机相关的API函数和导入方法”和“1.3.2 调用API函数实现关机的基本流程”小节的内容。完整的类的代码如下:using System;using System.Runtime.InteropServices ;namespace ExitWindowsAllpublic class ExitWindows/相关常量设置/说明:在VC+平台,这些常量已由系统定义

49、,不需要在程序中定义/这里常量命名遵循VC+的命名方法,目的是为了读者查询相关资料方便/在LookupPrivilegeValue函数中使用的常量/关机特权的常量internal const string SE_SHUTDOWN_NAME = SeShutdownPrivilege;/在OpenProcessToken函数中使用的常量/令牌查询方式的常量internal const int TOKEN_QUERY = 0x00000008;/令牌调整方式的常量internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; /在AdjustTok

50、enPrivileges函数中使用的常量/Windows系统特权常量internal const int SE_PRIVILEGE_ENABLED = 0x00000002;/在DoExitWin函数中使用的常量/注销计算机的常量internal const int EWX_LOGOFF = 0x00000000; /关机计算机的常量internal const int EWX_SHUTDOWN = 0x00000001;/重启计算机的常量internal const int EWX_REBOOT = 0x00000002; /强迫中止没有响应的进程的常量internal const int

51、EWX_FORCE = 0x00000004; /关闭电源的常量internal const int EWX_POWEROFF = 0x00000008;/中断进程的常量internal const int EWX_FORCEIFHUNG = 0x00000010; /定义向非托管函数之间相互传递值的结构体,/结构体的名称TokenPrivilegeLuid含义为令牌权限LuidStructLayout(LayoutKind.Sequential, Pack=1) internal struct TokenPrivilegeLuid /确定权限数组元素的个数public int Privile

52、gesCount; /Luid 的含义为 locally unique identifier/保证局部唯一标志,就是指在系统的每一次运行期间保证是唯一的值/这里定义存放权限的Luidpublic long PrivilegesLuid; /权限属性public int PrivilegesAttributes; /导入API函数/导入获取当前进程句柄的函数。DllImport(kernel32.dll, ExactSpelling=true) internal static extern IntPtr GetCurrentProcess();/导入打开当前进程的访问令牌的函数DllImport

53、(advapi32.dll, ExactSpelling=true, SetLastError=true) internal static extern bool OpenProcessToken( IntPtr h, int acc, ref IntPtr phtok );/导入获取系统特定的权限值的函数DllImport(advapi32.dll, SetLastError=true) internal static extern bool LookupPrivilegeValue( string host, string name, ref long pluid ); /导入调整访问令牌权限的函数DllImport(advapi32.dll, ExactSpelling=true, SetLas

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论