在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:关闭系统使之能完全关闭电源,所有文件缓冲区都被清洗到磁盘,所有的运行的进程都停止。

最新文章

  1. Java的生日
  2. Django分析之如何自定义manage命令
  3. 一行代码解释.net事件与委托
  4. 再谈HTML
  5. nenu contest3
  6. 【转】为什么C++编译器不能支持对模板的分离式编译
  7. CSS垂直和水平居中
  8. R语言︱非结构化数据处理神器——rlist包
  9. JDK1.8源码(二)——java.lang.Integer 类
  10. 对于错误“Refused to execute script from '...' because its MIME type ('') is not executable, and strict MIME type checking is enabled.”的处理。
  11. (一〇〇)使用AddressBookUI实现通讯录操作
  12. uiautomator2 使用Python测试 Android应用
  13. 【XSY1529】小Q与进位制 分治 FFT
  14. EF 指定字段修改
  15. android( java) 处理 null 和 预防空指针异常(NullPointerException) 的一些经验。
  16. 快速创建一个 spring mvc 示例
  17. mysql 事务隔离级别详解
  18. 【CodeForces】698 C. LRU
  19. 从JDBC看Mybatis的设计
  20. php 5.6 安装openssl extension 出现编译错误

热门文章

  1. 关于PHP在企业级开发领域的访谈
  2. 小鸟初学Shell编程(五)输入输出重定向
  3. CMake编译的VS工程,安装时遇到错误:error MSB3073: 命令“setlocal
  4. window10 蓝牙怎么连接音响或蓝牙耳机
  5. eclipse 导出 jar包详细步骤
  6. maven 学习---Eclipse构建Maven项目
  7. Oh-My-Zsh的配置与使用
  8. Jmeter对服务器进行压力测试
  9. JS高阶---回调函数
  10. 201871010133-赵永军《面向对象程序设计(java)》第七周学习总结