在Windows系统中有2种方式进行关机、重启以及注销计算机操作:
1、使用shutdown()命令;2、使用系统API;
以下是使用系统API进行操作的实例。
程序实例界面:
程序实例代码:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Text; 7 using System.Windows.Forms; 8 9 using System.Runtime.InteropServices; 10 11 12 namespace ShutDownSys 13 { 14 public partial class Form1 : Form 15 { 16 public Form1() 17 { 18 InitializeComponent(); 19 } 20 21 public class ShutDownSys 22 { 23 //C#关机代码 24 //这个结构体将会传递给API。使用StructLayout 25 //(...特性,确保其中成员是按顺序排列的,C#编译器不会对其进行调整) 26 [StructLayout(LayoutKind.Sequential, Pack = 1)] 27 internal struct TokPriv1Luid 28 { 29 public int Count; public long Luid; public int Attr; 30 } 31 32 //以下使用DLLImport特性导入了所需的Windows API。 33 //导入这些方法必须是static extern的,并且没有方法体。 34 //调用这些方法就相当于调用Windows API。 35 [DllImport("kernel32.dll", ExactSpelling = true)] 36 internal static extern IntPtr GetCurrentProcess(); 37 38 [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] 39 internal static extern bool OpenProcessToken(IntPtr h,int acc,ref IntPtr phtok); 40 41 [DllImport("advapi32.dll", SetLastError = true)] 42 internal static extern bool LookupPrivilegeValueA 43 (string host, string name, ref long pluid); 44 45 [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] 46 internal static extern bool 47 AdjustTokenPrivileges(IntPtr htok,bool disall,ref TokPriv1Luid newst,int len,IntPtr prev,IntPtr relen); 48 49 [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)] 50 internal static extern bool ExitWindowsEx(int flg,int rea); 51 52 //C#关机代码 53 //以下定义了在调用WinAPI时需要的常数。 54 //这些常数通常可以从Platform SDK的包含文件(头文件)中找到。 55 public const int SE_PRIVILEGE_ENABLED = 0x00000002; 56 public const int TOKEN_QUERY = 0x00000008; 57 public const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; 58 public const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege"; 59 public const int EWX_LOGOFF = 0x00000000; 60 public const int EWX_SHUTDOWN = 0x00000001; 61 public const int EWX_REBOOT = 0x00000002; 62 public const int EWX_FORCE = 0x00000004; 63 public const int EWX_POWEROFF = 0x00000008; 64 public const int EWX_FORCEIFHUNG = 0x00000010; 65 // 通过调用WinAPI实现关机,主要代码再最后一行ExitWindowsEx //这调用了同名的WinAPI,正好是关机用的。 66 67 68 public static void DoExitWin(int flg) 69 { 70 bool ok; 71 TokPriv1Luid tp; 72 IntPtr hproc = GetCurrentProcess(); 73 IntPtr htok = IntPtr.Zero; 74 ok = OpenProcessToken(hproc,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,ref htok); 75 tp.Count = 1; 76 tp.Luid = 0; 77 tp.Attr = SE_PRIVILEGE_ENABLED; 78 ok = LookupPrivilegeValueA(null,SE_SHUTDOWN_NAME,ref tp.Luid); 79 ok = AdjustTokenPrivileges(htok,false,ref tp,0,IntPtr.Zero,IntPtr.Zero); 80 ok = ExitWindowsEx(flg,0); 81 } 82 } 83 84 //调用 85 public void Reboot() 86 { 87 ShutDownSys.DoExitWin(ShutDownSys.EWX_FORCE | ShutDownSys.EWX_REBOOT); 88 } 89 90 public void ShutDown() 91 { 92 ShutDownSys.DoExitWin(ShutDownSys.EWX_FORCE | ShutDownSys.EWX_POWEROFF); 93 } 94 95 public void LogOff() 96 { 97 ShutDownSys.DoExitWin(ShutDownSys.EWX_FORCE | ShutDownSys.EWX_LOGOFF); 98 } 99 100 //关机 101 private void button1_Click(object sender, EventArgs e) 102 { 103 ShutDown(); 104 } 105 106 //重启 107 private void button2_Click(object sender, EventArgs e) 108 { 109 Reboot(); 110 } 111 112 //注销 113 private void button3_Click(object sender, EventArgs e) 114 { 115 LogOff(); 116 } 117 } 118 }
相关:
1、用System.Runtime.InteropServices服务的DllImport方法引入非托管代码程序集,例如调用系统API,C语言写的方法等等。在这种情况下,声明必须为static
extern 主要用于声明在外部实现的方法,同时,还可以定义外部程序集别名,使得可以从单个程序集中引用同一组件的不同版本。
2、
ExitwindowsEx函数的原型:
bool ExitwindowsEx(UINT uFlags,DWORD dwReserved);
函数功能:
该函数注销当前用户,关闭系统;或者关闭并重新启动系统。此函数发送WM_QUERYENDSESSION消息给应用程序来确定它们是否能被终止。
参数:
uFlags;指定关机类型。此参数必须包括下列值之一:EWX_LOGOFF,EWX_POWEROFF,EWX_REBOOT,EWX_SHUTDOWN。还包括EWX_FORCE,EWX_FORCEIFHUNG两个可选值。
EWX_LOGOFF:关闭所有调用函数ExitWindowsEx的进程的安全环境里运行的进程,然后注销用户。
EWX_REBOOT:关闭系统并重新启动系统。
EWX_SHUTDOWN:关闭系统使之能完全关闭电源,所有文件缓冲区都被清洗到磁盘,所有的运行的进程都停止。