C# API强制关机、重启以及注销计算机
在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强制关机、重启以及注销计算机相关推荐
- 计算机锁定不能强制选项无法关机,win7系统1909无法关机只能强制关机重启的解决办法...
win7系统1909无法关机只能强制关机重启的解决办法? 我们在安装更新了win71909版本系统之后,在关电脑的过程中发现电脑一直停留在显示关机的界面,但是并没有直接关掉只能重启.对于这种问题,小编 ...
- HTML强制关机,电脑死机如何强制关机重启
电脑卡住了死机如何强制关机重启?我们在使用电脑的时候经常会出现电脑卡住死机无法操作的问题,如果持续等待也不会有结果,也会浪费时间,拔电源是不建议大家去做的,下面就教大家如何去操作! 方法一: 1.我们 ...
- 黑屏?白屏?蓝屏?整理戴尔G3在使用过程中遇到的,一些强制关机重启就能解决的问题
强制关机可谓是笔记本使用者经常用的一种手段了,以至于坊间流传一句话: "遇事不决,10秒强制关机" 博主使用G3 3590近3年了,做个笔记来记录遇到的一些,使用强制关机,再开机就 ...
- Linux学习 | vim编辑器关机重启登录注销
文章目录 一.vim编辑器 1.1 基本介绍 1.2 vim编辑器的三种模式 1.2.1 一般模式 1.2.2 编辑模式 1.2.3 命令行模式 1.3 vim快捷键 二.关机重启&登录注销 ...
- 强制关机/重启/注销
Windows关机函数 最常用: ExitWindowsEx(EWX_SHUTDOWN, 0); ExitWindowsEx(EWX_REBOOT, 0); ExitWind ...
- Ubuntu 的关机重启与注销
1.关机命令 shutdown shutdown命令安全地将系统关机. 有些用户会使用直接断掉电源的方式来关闭linux,这是十分危险的.因为linux与windows不同,其后台运行着许多进程,所以 ...
- C#强制关机、重启以及注销计算机
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServi ...
- Shell命令-关机重启及注销之logout、exit
内容更新中 转载于:https://www.cnblogs.com/wjcLinux/p/11125863.html
- iphone11如何强制关机 苹果11手机一键强制重启方法教程
iphone11如何强制关机?iphone11如何强制重启?对于iphone11可是很多网友们的最爱,但是长时间使用之后,难免都会出现一些问题,比如手机无法关机?无法重启?那么想要让苹果手机强制关机重 ...
最新文章
- mysql update时数据不存在新增_mysql sql语句新增判断,存在修改,不存在新增
- 数据中心在2017年的愿望清单
- java重新组合_Java 合并Word文档
- Xamarin IOS – hello word
- 跟我一起玩Win32开发(20):浏览文件夹
- 怎么一键执行java程序_如何快速、低成本、低扰动地运行一段Java代码
- Exchange Server 2016 独立部署/共存部署 (六)—— 创建数据库副本
- IT技术 VS IT管理!为什么国内大公司都看不起搞技术的?
- 日期判断是今天/明天/后天
- yii2 联表查询时,查询关联表的字段时,使用asArray方法
- bzoj1061 志愿者招募
- HDU2093--考试排名
- 虚拟机bug 切换不了英文字母的大小写问题
- 磁环介绍与应用(转)
- java 聊天机器人_java实现自动回复聊天机器人
- python bs4 之 BeautifulSoup 爬虫使用
- 折线多边形的原位放大
- DSS 代码分析【启动、初始化流程】
- 初级程序员与高级程序员
- 计量经济学:异方差性