C#實(shí)現(xiàn)windows系統(tǒng)重啟和關(guān)機(jī)的代碼詳解
1、使用shutdown關(guān)機(jī)命令來(lái)實(shí)現(xiàn)
using System.Diagnostics; int time = 3600; //單位為:秒 Process.Start("c:/windows/system32/shutdown.exe", "-s -t "+time);
實(shí)現(xiàn)原理,使用系統(tǒng)shutdown命令執(zhí)行:
強(qiáng)制關(guān)機(jī):
shutdown -s -f -t 0
強(qiáng)制重啟:
shutdown -r -f -t 0
關(guān)于shutdown命令詳解:
用法: shutdown [-i | -l | -s | -r | -a] [-f] [-m computername] [-t xx] [-c “comment”] [-d up:xx:yy]
沒有參數(shù) 顯示此消息(與 ? 相同)
-i 顯示 GUI 界面,必須是第一個(gè)選項(xiàng)
-l 注銷(不能與選項(xiàng) -m 一起使用)
-s 關(guān)閉此計(jì)算機(jī)
-r 關(guān)閉并重啟動(dòng)此計(jì)算機(jī)
-a 放棄系統(tǒng)關(guān)機(jī)
-m computername 遠(yuǎn)程計(jì)算機(jī)關(guān)機(jī)/重啟動(dòng)/放棄
-t xx 設(shè)置關(guān)閉的超時(shí)為 xx 秒
-c “comment” 關(guān)閉注釋(最大 127 個(gè)字符)
-f 強(qiáng)制運(yùn)行的應(yīng)用程序關(guān)閉而沒有警告
-d [ u ][p]:xx:yy 關(guān)閉原因代碼
u 是用戶代碼
p 是一個(gè)計(jì)劃的關(guān)閉代碼
xx 是一個(gè)主要原因代碼(小于 256 的正整數(shù))
yy 是一個(gè)次要原因代碼(小于 65536 的正整數(shù))
-f:強(qiáng)行關(guān)閉應(yīng)用程序
-m 計(jì)算機(jī)名:控制遠(yuǎn)程計(jì)算機(jī)
-i:顯示圖形用戶界面,但必須是Shutdown的第一個(gè)選項(xiàng)
-l:注銷當(dāng)前用戶
-r:關(guān)機(jī)并重啟
-t時(shí)間:設(shè)置關(guān)機(jī)倒計(jì)時(shí)
-c “消息內(nèi)容”:輸入關(guān)機(jī)對(duì)話框中的消息內(nèi)容(不能超127個(gè)字符)
比如你的電腦要在12:00關(guān)機(jī),可以選擇“開始→運(yùn)行”,輸入“at 12:00 Shutdown -s",這樣,到了12點(diǎn)電腦就會(huì)出現(xiàn)“系統(tǒng)關(guān)機(jī)”對(duì)話框,默認(rèn)有30秒鐘的倒計(jì)時(shí)并提示你保存工作。
如果你想以倒計(jì)時(shí)的方式關(guān)機(jī),可以輸入 “Shutdown.exe -s -t 3600",這里表示60分鐘后自動(dòng)關(guān)機(jī),“3600"代表60分鐘。
一鍵關(guān)機(jī):
1、首先在桌面的空白處單擊鼠標(biāo)右鍵,新建一個(gè)“快捷方式”。
2、在創(chuàng)建快捷方式的“命令行”中輸入以下的指令:
“shutdown –s –t 0 ”。(在windows98按此輸入“C:windowsRUNDLL32.EXE user,ExitWindows”。)
3、按著鼠標(biāo)選擇“下一步”,在快捷方式的名稱欄中輸入“一鍵關(guān)機(jī)”或其他自己喜歡的名稱。
4、之后,你就會(huì)在桌面見到一個(gè)名為“一鍵關(guān)機(jī)”的快捷方式圖標(biāo),在該圖標(biāo)上單擊鼠標(biāo)右鍵,選擇“屬性”,再進(jìn)入“快捷方式”頁(yè),然后在“快速鍵一欄內(nèi)隨便按選一個(gè)功能鍵(如F1-F12)。建議大家最好選一個(gè)平時(shí)不常用的功能鍵,最后按確定退出即可。
Windows系統(tǒng)通過一個(gè)名為shutdown.exe的程序來(lái)完成關(guān)機(jī)操作(位置Windows\System32下),一般情況下Windows系統(tǒng)的關(guān)機(jī)都可以由關(guān)機(jī)程序 shutdown.exe來(lái)實(shí)現(xiàn)的,關(guān)機(jī)的時(shí)候調(diào)用shutdown.exe。由此可知要阻止強(qiáng)行關(guān)機(jī)就是要取消對(duì)shutdown.exe的調(diào)用。
使用C#代碼實(shí)現(xiàn)控制Windows系統(tǒng)關(guān)機(jī)、重啟和注銷的方法,使用.NET和C#.NET,我們可以對(duì)當(dāng)前PC執(zhí)行關(guān)機(jī),重啟,注銷操作,
.NET Framework中,有一個(gè)命名空間System.Diagnostics具有所需的類和方法,從當(dāng)前PC上運(yùn)行.NET應(yīng)用程序來(lái)執(zhí)行這些操作 。一般使用System.Diagnostics.Process.Start()方法來(lái)啟動(dòng)shutdown.exe程序。
示例:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //重啟電腦 // APIHelper.ExitWindows(UFlag.EWX_REBOOT);//該方法無(wú)效 string ss= APIHelper.DOSCommand("shutdown -r -t 2"); MessageBox.Show(ss); } private void button2_Click(object sender, EventArgs e) { //注銷電腦 APIHelper.ExitWindows(UFlag.EWX_LOGOFF); } private void button3_Click(object sender, EventArgs e) { //關(guān)閉電腦 // APIHelper.ExitWindows(UFlag.EWX_SHUTDOWN);//無(wú)效 string ss= APIHelper.DOSCommand("shutdown -s -t 2"); MessageBox.Show(ss); } private void button4_Click(object sender, EventArgs e) { string ss = APIHelper.DOSCommand("shutdown -a"); MessageBox.Show(ss); } } /// <summary> /// PC操作功能代碼 /// </summary> enum UFlag { /// <summary> /// 強(qiáng)迫終止沒有響應(yīng)的進(jìn)程 /// </summary> EWX_FORCE=4, /// <summary> /// 注銷 /// </summary> EWX_LOGOFF=0, /// <summary> /// 重啟 /// </summary> EWX_REBOOT=2, /// <summary> /// 關(guān)閉系統(tǒng) /// </summary> EWX_SHUTDOWN=1 } class APIHelper { /// <summary> /// 使用dos命令進(jìn)行操作 /// </summary> /// <param name="cmdStr"></param> /// <returns></returns> public static string DOSCommand(string cmdStr) { System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo(); info.CreateNoWindow =true;//不顯示黑窗口 info.FileName = "cmd.exe"; info.RedirectStandardError = true; info.RedirectStandardInput = true; info.RedirectStandardOutput = true; info.UseShellExecute = false; var p = System.Diagnostics.Process.Start(info); //處理辦法1: //using (System.IO.TextWriter tw= p.StandardInput) //{ // tw.WriteLine(cmdStr); //} //處理辦法2:在指令后添加:&exit。 p.StandardInput.WriteLine(cmdStr + "&exit"); p.WaitForExit(); string str = ""; using (System.IO.TextReader tr = p.StandardOutput) { str = tr.ReadToEnd(); } p.Close(); return str; } public static int ExitWindows(UFlag flag) { return ExitWindowsEx((int)flag, 0); } /// <summary> /// 注銷,關(guān)閉,重啟電腦 /// </summary> /// <param name="uFlag">要執(zhí)行的操作</param> /// <param name="dwReserved">保留值,一般設(shè)置為0</param> /// <returns></returns> [DllImport("user32.dll")] extern static int ExitWindowsEx(int uFlag, int dwReserved); }
具體使用方法可參考shutdown.exe的命令行指令。這種方法可在PC上使用,不過當(dāng)系統(tǒng)為WINCE時(shí),WINCE沒有shutdown.exe,所以該方法將不再使用??捎玫诙N方法。
2、調(diào)用WIN32 API來(lái)實(shí)現(xiàn)
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace TestShutdown { class SystemUtil { [StructLayout(LayoutKind.Sequential, Pack = 1)] internal struct TokPriv1Luid { public int Count; public long Luid; public int Attr; } [DllImport("kernel32.dll", ExactSpelling = true)] internal static extern IntPtr GetCurrentProcess(); [DllImport("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, SetLastError = true)] internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen); [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)] internal static extern bool ExitWindowsEx(int flg, int rea); internal const int SE_PRIVILEGE_ENABLED = 0x00000002; internal const int TOKEN_QUERY = 0x00000008; internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege"; internal const int EWX_LOGOFF = 0x00000000; internal const int EWX_SHUTDOWN = 0x00000001; internal const int EWX_REBOOT = 0x00000002; internal const int EWX_FORCE = 0x00000004; internal const int EWX_POWEROFF = 0x00000008; internal const int EWX_FORCEIFHUNG = 0x00000010; private static void DoExitWin(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 static void Reboot() { DoExitWin(EWX_FORCE | EWX_REBOOT); //重啟 } public static void PowerOff() { DoExitWin(EWX_FORCE | EWX_POWEROFF); //關(guān)機(jī) } public static void LogoOff() { DoExitWin(EWX_FORCE | EWX_LOGOFF); //注銷 } } }
以上就是C#實(shí)現(xiàn)windows系統(tǒng)重啟和關(guān)機(jī)的代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于C# windows重啟和關(guān)機(jī)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# FileStream實(shí)現(xiàn)多線程斷點(diǎn)續(xù)傳
這篇文章主要為大家詳細(xì)介紹了C# FileStream實(shí)現(xiàn)多線程斷點(diǎn)續(xù)傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03C#中Clone一個(gè)對(duì)象的值到另一個(gè)對(duì)象案例
這篇文章主要介紹了C#中Clone一個(gè)對(duì)象的值到另一個(gè)對(duì)象案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-12-12C#使用Directoryinfo類獲得目錄信息和屬性的方法
這篇文章主要介紹了C#使用Directoryinfo類獲得目錄信息和屬性的方法,涉及C#操作目錄的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04C#根據(jù)反射和特性實(shí)現(xiàn)ORM映射實(shí)例分析
這篇文章主要介紹了C#根據(jù)反射和特性實(shí)現(xiàn)ORM映射的方法,實(shí)例分析了反射的原理、特性與ORM的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04C# 使用multipart form-data方式post數(shù)據(jù)到服務(wù)器
這篇文章主要介紹了C# 使用multipart form-data方式post數(shù)據(jù)到服務(wù)器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08C# GetField方法的應(yīng)用實(shí)例講解
C#中的GetField是一個(gè)反射方法,用于獲取指定類型的字段信息,它可以通過字段名稱來(lái)獲取字段對(duì)象,并且可以在運(yùn)行時(shí)動(dòng)態(tài)地訪問和操作這些字段,本文給大家介紹了C# GetField方法的應(yīng)用,需要的朋友可以參考下2024-04-04如何用C#獲取計(jì)算機(jī)詳細(xì)的軟件和硬件信息
我們應(yīng)該都知道System.Management提供的類可以用于讀取本地計(jì)算機(jī)設(shè)備的各種數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于如何用C#獲取計(jì)算機(jī)詳細(xì)的軟件和硬件信息的相關(guān)資料,需要的朋友可以參考下2022-12-12