在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 ShutDownSys13 {14     public partial class Form1 : Form15     {16         public Form1()17         {18             InitializeComponent();19         }20 21         public class ShutDownSys22         { 23             //C#关机代码24             //这个结构体将会传递给API。使用StructLayout25             //(...特性,确保其中成员是按顺序排列的,C#编译器不会对其进行调整)26             [StructLayout(LayoutKind.Sequential, Pack = 1)]27             internal struct TokPriv1Luid28             {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 LookupPrivilegeValueA43             (string host, string name, ref long pluid);44 45             [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]46             internal static extern bool47             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:关闭系统使之能完全关闭电源,所有文件缓冲区都被清洗到磁盘,所有的运行的进程都停止。

C# API强制关机、重启以及注销计算机相关推荐

  1. 计算机锁定不能强制选项无法关机,win7系统1909无法关机只能强制关机重启的解决办法...

    win7系统1909无法关机只能强制关机重启的解决办法? 我们在安装更新了win71909版本系统之后,在关电脑的过程中发现电脑一直停留在显示关机的界面,但是并没有直接关掉只能重启.对于这种问题,小编 ...

  2. HTML强制关机,电脑死机如何强制关机重启

    电脑卡住了死机如何强制关机重启?我们在使用电脑的时候经常会出现电脑卡住死机无法操作的问题,如果持续等待也不会有结果,也会浪费时间,拔电源是不建议大家去做的,下面就教大家如何去操作! 方法一: 1.我们 ...

  3. 黑屏?白屏?蓝屏?整理戴尔G3在使用过程中遇到的,一些强制关机重启就能解决的问题

    强制关机可谓是笔记本使用者经常用的一种手段了,以至于坊间流传一句话: "遇事不决,10秒强制关机" 博主使用G3 3590近3年了,做个笔记来记录遇到的一些,使用强制关机,再开机就 ...

  4. Linux学习 | vim编辑器关机重启登录注销

    文章目录 一.vim编辑器 1.1 基本介绍 1.2 vim编辑器的三种模式 1.2.1 一般模式 1.2.2 编辑模式 1.2.3 命令行模式 1.3 vim快捷键 二.关机重启&登录注销 ...

  5. 强制关机/重启/注销

    Windows关机函数 最常用:        ExitWindowsEx(EWX_SHUTDOWN, 0);       ExitWindowsEx(EWX_REBOOT, 0); ExitWind ...

  6. Ubuntu 的关机重启与注销

    1.关机命令 shutdown shutdown命令安全地将系统关机. 有些用户会使用直接断掉电源的方式来关闭linux,这是十分危险的.因为linux与windows不同,其后台运行着许多进程,所以 ...

  7. C#强制关机、重启以及注销计算机

    using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServi ...

  8. Shell命令-关机重启及注销之logout、exit

    内容更新中 转载于:https://www.cnblogs.com/wjcLinux/p/11125863.html

  9. iphone11如何强制关机 苹果11手机一键强制重启方法教程

    iphone11如何强制关机?iphone11如何强制重启?对于iphone11可是很多网友们的最爱,但是长时间使用之后,难免都会出现一些问题,比如手机无法关机?无法重启?那么想要让苹果手机强制关机重 ...

最新文章

  1. mysql update时数据不存在新增_mysql sql语句新增判断,存在修改,不存在新增
  2. 数据中心在2017年的愿望清单
  3. java重新组合_Java 合并Word文档
  4. Xamarin IOS – hello word
  5. 跟我一起玩Win32开发(20):浏览文件夹
  6. 怎么一键执行java程序_如何快速、低成本、低扰动地运行一段Java代码
  7. Exchange Server 2016 独立部署/共存部署 (六)—— 创建数据库副本
  8. IT技术 VS IT管理!为什么国内大公司都看不起搞技术的?
  9. 日期判断是今天/明天/后天
  10. yii2 联表查询时,查询关联表的字段时,使用asArray方法
  11. bzoj1061 志愿者招募
  12. HDU2093--考试排名
  13. 虚拟机bug 切换不了英文字母的大小写问题
  14. 磁环介绍与应用(转)
  15. java 聊天机器人_java实现自动回复聊天机器人
  16. python bs4 之 BeautifulSoup 爬虫使用
  17. 折线多边形的原位放大
  18. DSS 代码分析【启动、初始化流程】
  19. 初级程序员与高级程序员
  20. 计量经济学:异方差性

热门文章

  1. OpenCV SFM模块安装
  2. QT的QException类的使用
  3. 经典C语言程序100例之九八
  4. 经典C语言程序100例之二
  5. C语言 其他标准函数
  6. c++TCP的三次握手和四次挥手
  7. HDFS权限设置 \ HDFS涉及ACLs的命令
  8. CentOS6.4安装Samba(匿名)共享服务器
  9. oracle 删除补全日志组_浅谈Oracle 20c ASM文件组模板技术
  10. java代码中哪些不能犯的错误_Java程序员工作中千万不能犯的3个低级错误