C#实现关机重启及注销实例代码
本文所述的C#实例代码是一个基于VisualC#2010编写的关机、重启、注销程序,类似的C#程序网上还有不少,每个人的写法都各有不同,这段程序供新手参考下。本代码中还用到了一个计时器,用来显示系统运行的时间,以下为完整实例代码:
usingSystem; usingSystem.Drawing; usingSystem.Collections; usingSystem.ComponentModel; usingSystem.Windows.Forms; usingSystem.Data; usingSystem.Runtime.InteropServices; usingSystem.Threading; namespaceshutdowncodes { publicclassForm1:System.Windows.Forms.Form { privateSystem.Windows.Forms.GroupBoxgroupBox1; privateSystem.Windows.Forms.TextBoxtextBox1; privateSystem.Windows.Forms.Buttonbutton1; privateSystem.Windows.Forms.Buttonbutton2; privateSystem.Windows.Forms.Buttonbutton3; privateSystem.ComponentModel.IContainercomponents; [StructLayout(LayoutKind.Sequential,Pack=1)] publicstructTokPriv1Luid { publicintCount; publiclongLuid; publicintAttr; } [DllImport("kernel32.dll",ExactSpelling=true)] //GetCurrentProcess函数返回当前进程的一个句柄 publicstaticexternIntPtrGetCurrentProcess(); [DllImport("advapi32.dll",ExactSpelling=true,SetLastError=true)] //OpenProcessToken函数打开一个进程的访问代号 publicstaticexternboolOpenProcessToken(IntPtrProcessHandles,intDesiredAccess,refIntPtrTokenHandle); [DllImport("advapi32.dll",SetLastError=true)] //LookupPrivilegeValue函数获得本地唯一的标示符(LUID),用于在特定的系统中 //表示特定的优先权。 publicstaticexternboolLookupPrivilegeValue(stringlpSystemName,stringlpName,reflonglpLuid); //AdjustTokenPrivileges函数允许或者禁用指定访问记号的优先权。 //允许或者禁用优先权需要TOKEN_ADJUST_PRIVILEGES访问权限。 [DllImport("advapi32.dll",ExactSpelling=true,SetLastError=true)] publicstaticexternboolAdjustTokenPrivileges(IntPtrTokenHandle,boolDisableAllPrivileges,refTokPriv1LuidNewState,intBufferLength,IntPtrPreviousState,IntPtrReturnLength); //ExitWindowsEx函数可以注销,关机或者重新启动系统 [DllImport("user32.dll",ExactSpelling=true,SetLastError=true)] publicstaticexternboolExitWindowsEx(intflg,intrea); privateSystem.Threading.Timertimer; privateconstintSE_PRIVILEGE_ENABLED=0x00000002; privateconstintTOKEN_QUERY=0x00000008; privateconstintTOKEN_ADJUST_PRIVILEGES=0x00000020; privateconststringSE_SHUTDOWN_NAME="SeShutdownPrivilege"; privateconstintEWX_LOGOFF=0x00000000;//注销 privateconstintEWX_SHUTDOWN=0x00000001;//关机 privateconstintEWX_REBOOT=0x00000002;//重启 privateconstintEWX_FORCE=0x00000004; privatestaticvoidRebootCommand(intflg) { boolok; TokPriv1Luidtp; IntPtrhproc=GetCurrentProcess();//得到当前的进程 IntPtrhtok=IntPtr.Zero; ok=OpenProcessToken(hproc,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,refhtok); tp.Count=1; tp.Luid=0; tp.Attr=SE_PRIVILEGE_ENABLED; ok=LookupPrivilegeValue(null,SE_SHUTDOWN_NAME,reftp.Luid); ok=AdjustTokenPrivileges(htok,false,reftp,0,IntPtr.Zero,IntPtr.Zero); ok=ExitWindowsEx(flg,0); } publicForm1() { InitializeComponent(); } protectedoverridevoidDispose(booldisposing) { if(disposing) { if(components!=null) { components.Dispose(); } } base.Dispose(disposing); } #regionWindows窗体设计器生成的代码 privatevoidInitializeComponent() { this.groupBox1=newSystem.Windows.Forms.GroupBox(); this.textBox1=newSystem.Windows.Forms.TextBox(); this.button1=newSystem.Windows.Forms.Button(); this.button2=newSystem.Windows.Forms.Button(); this.button3=newSystem.Windows.Forms.Button(); this.groupBox1.SuspendLayout(); this.SuspendLayout(); // //groupBox1 // this.groupBox1.Controls.Add(this.textBox1); this.groupBox1.Location=newSystem.Drawing.Point(48,24); this.groupBox1.Name="groupBox1"; this.groupBox1.Size=newSystem.Drawing.Size(192,56); this.groupBox1.TabIndex=0; this.groupBox1.TabStop=false; this.groupBox1.Text="系统已运行时间"; // //textBox1 // this.textBox1.Location=newSystem.Drawing.Point(24,24); this.textBox1.Name="textBox1"; this.textBox1.ReadOnly=true; this.textBox1.Size=newSystem.Drawing.Size(152,21); this.textBox1.TabIndex=1; this.textBox1.Text=""; // //button1 // this.button1.Location=newSystem.Drawing.Point(16,112); this.button1.Name="button1"; this.button1.Size=newSystem.Drawing.Size(64,32); this.button1.TabIndex=1; this.button1.Text="关闭系统"; this.button1.Click+=newSystem.EventHandler(this.button1_Click); // //button2 // this.button2.Location=newSystem.Drawing.Point(112,112); this.button2.Name="button2"; this.button2.Size=newSystem.Drawing.Size(64,32); this.button2.TabIndex=2; this.button2.Text="注销系统"; this.button2.Click+=newSystem.EventHandler(this.button2_Click); // //button3 // this.button3.Location=newSystem.Drawing.Point(208,112); this.button3.Name="button3"; this.button3.Size=newSystem.Drawing.Size(64,32); this.button3.TabIndex=3; this.button3.Text="重启系统"; this.button3.Click+=newSystem.EventHandler(this.button3_Click); // //Form1 // this.AutoScaleBaseSize=newSystem.Drawing.Size(6,14); this.ClientSize=newSystem.Drawing.Size(296,173); this.Controls.Add(this.button3); this.Controls.Add(this.button2); this.Controls.Add(this.button1); this.Controls.Add(this.groupBox1); this.Name="Form1"; this.Text="简单的关机程序"; this.Load+=newSystem.EventHandler(this.Form1_Load); this.groupBox1.ResumeLayout(false); this.ResumeLayout(false); } #endregion ///<summary> ///应用程序的主入口点。 ///</summary> [STAThread] staticvoidMain() { Application.Run(newForm1()); } privatevoidbutton1_Click(objectsender,System.EventArgse) { RebootCommand(EWX_SHUTDOWN+EWX_FORCE); } privatevoidbutton2_Click(objectsender,System.EventArgse) { RebootCommand(EWX_LOGOFF+EWX_FORCE); } privatevoidbutton3_Click(objectsender,System.EventArgse) { RebootCommand(EWX_REBOOT+EWX_FORCE); } privatevoidForm1_Load(objectsender,System.EventArgse) { textBox1.Text=(Environment.TickCount/(1000*60)).ToString()+"分钟"; //每1秒钟更新一次TextBox上显示的系统运行时间 timer=newSystem.Threading.Timer(newTimerCallback(OnTimer),null,0,1000); } //获得系统已运行的时间 privatevoidOnTimer(objectstate) { textBox1.Text=(Environment.TickCount/(1000*60)).ToString()+"分钟"; textBox1.Refresh(); } } }