C#實現(xiàn)關(guān)機重啟及注銷實例代碼
更新時間:2014年07月25日 16:52:31 投稿:shichen2014
這篇文章主要介紹了C#實現(xiàn)關(guān)機重啟及注銷實例代碼,適合新手參考學習之用,需要的朋友可以參考下
本文所述的C#實例代碼是一個基于Visual C#2010編寫的關(guān)機、重啟、注銷程序,類似的C#程序網(wǎng)上還有不少,每個人的寫法都各有不同,這段程序供新手參考下。本代碼中還用到了一個計時器,用來顯示系統(tǒng)運行的時間,以下為完整實例代碼:
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Runtime.InteropServices; using System.Threading; namespace shutdowncodes { public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; private System.Windows.Forms.Button button3; private System.ComponentModel.IContainer components; [StructLayout(LayoutKind.Sequential, Pack=1)] public struct TokPriv1Luid { public int Count; public long Luid; public int Attr; } [DllImport("kernel32.dll", ExactSpelling=true)] // GetCurrentProcess函數(shù)返回當前進程的一個句柄 public static extern IntPtr GetCurrentProcess(); [DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true)] // OpenProcessToken函數(shù)打開一個進程的訪問代號 public static extern bool OpenProcessToken(IntPtr ProcessHandles, int DesiredAccess, ref IntPtr TokenHandle); [DllImport("advapi32.dll", SetLastError=true)] // LookupPrivilegeValue函數(shù)獲得本地唯一的標示符(LUID),用于在特定的系統(tǒng)中 // 表示特定的優(yōu)先權(quán)。 public static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, ref long lpLuid); // AdjustTokenPrivileges函數(shù)允許或者禁用指定訪問記號的優(yōu)先權(quán)。 // 允許或者禁用優(yōu)先權(quán)需要TOKEN_ADJUST_PRIVILEGES訪問權(quán)限。 [DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true)] public static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, bool DisableAllPrivileges, ref TokPriv1Luid NewState, int BufferLength, IntPtr PreviousState,IntPtr ReturnLength); // ExitWindowsEx函數(shù)可以注銷,關(guān)機或者重新啟動系統(tǒng) [DllImport("user32.dll", ExactSpelling=true, SetLastError=true)] public static extern bool ExitWindowsEx(int flg, int rea); private System.Threading.Timer timer; private const int SE_PRIVILEGE_ENABLED = 0x00000002; private const int TOKEN_QUERY = 0x00000008; private const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; private const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege"; private const int EWX_LOGOFF = 0x00000000; // 注銷 private const int EWX_SHUTDOWN = 0x00000001; // 關(guān)機 private const int EWX_REBOOT = 0x00000002; // 重啟 private const int EWX_FORCE = 0x00000004; private static void RebootCommand(int flg) { bool ok; TokPriv1Luid tp; IntPtr hproc = GetCurrentProcess(); // 得到當前的進程 IntPtr htok = IntPtr.Zero; ok = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok); tp.Count = 1; tp.Luid = 0; tp.Attr = SE_PRIVILEGE_ENABLED; ok = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid); ok = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero); ok = ExitWindowsEx(flg, 0); } public Form1() { InitializeComponent(); } protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows 窗體設(shè)計器生成的代碼 private void InitializeComponent() { this.groupBox1 = new System.Windows.Forms.GroupBox(); this.textBox1 = new System.Windows.Forms.TextBox(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.button3 = new System.Windows.Forms.Button(); this.groupBox1.SuspendLayout(); this.SuspendLayout(); // // groupBox1 // this.groupBox1.Controls.Add(this.textBox1); this.groupBox1.Location = new System.Drawing.Point(48, 24); this.groupBox1.Name = "groupBox1"; this.groupBox1.Size = new System.Drawing.Size(192, 56); this.groupBox1.TabIndex = 0; this.groupBox1.TabStop = false; this.groupBox1.Text = "系統(tǒng)已運行時間"; // // textBox1 // this.textBox1.Location = new System.Drawing.Point(24, 24); this.textBox1.Name = "textBox1"; this.textBox1.ReadOnly = true; this.textBox1.Size = new System.Drawing.Size(152, 21); this.textBox1.TabIndex = 1; this.textBox1.Text = ""; // // button1 // this.button1.Location = new System.Drawing.Point(16, 112); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(64, 32); this.button1.TabIndex = 1; this.button1.Text = "關(guān)閉系統(tǒng)"; this.button1.Click += new System.EventHandler(this.button1_Click); // // button2 // this.button2.Location = new System.Drawing.Point(112, 112); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(64, 32); this.button2.TabIndex = 2; this.button2.Text = "注銷系統(tǒng)"; this.button2.Click += new System.EventHandler(this.button2_Click); // // button3 // this.button3.Location = new System.Drawing.Point(208, 112); this.button3.Name = "button3"; this.button3.Size = new System.Drawing.Size(64, 32); this.button3.TabIndex = 3; this.button3.Text = "重啟系統(tǒng)"; this.button3.Click += new System.EventHandler(this.button3_Click); // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.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 = "簡單的關(guān)機程序"; this.Load += new System.EventHandler(this.Form1_Load); this.groupBox1.ResumeLayout(false); this.ResumeLayout(false); } #endregion /// <summary> /// 應(yīng)用程序的主入口點。 /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } private void button1_Click(object sender, System.EventArgs e) { RebootCommand(EWX_SHUTDOWN + EWX_FORCE); } private void button2_Click(object sender, System.EventArgs e) { RebootCommand(EWX_LOGOFF + EWX_FORCE); } private void button3_Click(object sender, System.EventArgs e) { RebootCommand(EWX_REBOOT + EWX_FORCE); } private void Form1_Load(object sender, System.EventArgs e) { textBox1.Text = (Environment.TickCount / (1000 * 60)).ToString() + "分鐘"; // 每1秒鐘更新一次TextBox上顯示的系統(tǒng)運行時間 timer = new System.Threading.Timer(new TimerCallback(OnTimer), null, 0, 1000); } // 獲得系統(tǒng)已運行的時間 private void OnTimer(object state) { textBox1.Text = (Environment.TickCount / (1000 * 60)).ToString() + "分鐘"; textBox1.Refresh(); } } }
相關(guān)文章
C#和vb.net實現(xiàn)PDF 添加可視化和不可見數(shù)字簽名
本文通過C#程序代碼展示如何給PDF文檔添加可視化數(shù)字簽名和不可見數(shù)字簽名。文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08C#實現(xiàn)兩個richtextbox控件滾動條同步滾動的簡單方法
這篇文章主要給大家介紹了C#實現(xiàn)兩個richtextbox控件滾動條同步滾動的簡單方法,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。2017-05-05C#/VB.NET 在PDF中添加文件包(Portfolio)的方法
這篇文章主要介紹了C#/VB.NET 在PDF中添加文件包(Portfolio)的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-06-06C#實現(xiàn)打開畫圖的同時載入圖片、最大化顯示畫圖窗體的方法
這篇文章主要介紹了C#實現(xiàn)打開畫圖的同時載入圖片、最大化顯示畫圖窗體的方法,涉及C#針對窗體及圖片操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08