一、调用 shutdown.exe 执行操作

调用 shutdown.exe 执行计算机关机、重启、注销操作,还可以设置多长时间后执行操作,代码如下:

 1         /// <summary>
2 /// 控制 PC 开机、重启
3 /// </summary>
4 /// <param name="cmd">0:关机;1:重启;2:注销</param>
5 public static void ShutdownComputer(int cmd)
6 {
7 try
8 {
9
10 if (cmd == 0)//5秒后关机
11 {
12 System.Diagnostics.Process.Start("shutdown.exe", "/s /t 5");
13 }
14 else if (cmd == 1)//5秒后重启
15 {
16 System.Diagnostics.Process.Start("shutdown.exe", "/r /t 5");
17 }
18 else if (cmd == 2)//注销
19 {
20 System.Diagnostics.Process.Start("shutdown.exe", "/l");
21 }
22 }
23 catch (Exception ex)
24 {
25 Console.WriteLine($"启动电脑关机程序异常", ex);
26 }
27 }

二、使用 WInAPI 执行操作

使用 WInAPI 直接调用关机、重启、注销操作,更为快速稳定,具体代码如下:

 1  class SystemUtil
2 {
3 [StructLayout(LayoutKind.Sequential, Pack = 1)]
4 internal struct TokPriv1Luid
5 {
6 public int Count;
7 public long Luid;
8 public int Attr;
9 }
10
11 [DllImport("kernel32.dll", ExactSpelling = true)]
12 private static extern IntPtr GetCurrentProcess();
13
14 [System.Runtime.InteropServices.DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
15 private static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);
16
17 [DllImport("advapi32.dll", SetLastError = true)]
18 private static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);
19
20 [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
21 private static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);
22
23 [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
24 private static extern bool ExitWindowsEx(int flg, int rea);
25
26 private const int SE_PRIVILEGE_ENABLED = 0x00000002;
27 private const int TOKEN_QUERY = 0x00000008;
28 private const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
29 private const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
30 private const int EWX_LOGOFF = 0x00000000;
31 private const int EWX_SHUTDOWN = 0x00000001;
32 private const int EWX_REBOOT = 0x00000002;
33 private const int EWX_FORCE = 0x00000004;
34 private const int EWX_POWEROFF = 0x00000008;
35 private const int EWX_FORCEIFHUNG = 0x00000010;
36
37 private static void DoExitWin(int flg)
38 {
39 IntPtr hproc = GetCurrentProcess();
40 IntPtr htok = IntPtr.Zero;
41 TokPriv1Luid tpl = new TokPriv1Luid()
42 {
43 Count = 1,
44 Luid = 0,
45 Attr = SE_PRIVILEGE_ENABLED,
46 };
47 OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
48 LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tpl.Luid);
49 AdjustTokenPrivileges(htok, false, ref tpl, 0, IntPtr.Zero, IntPtr.Zero);
50 ExitWindowsEx(flg, 0);
51 }
52
53 /// <summary>
54 /// 控制 PC 开机、重启
55 /// </summary>
56 /// <param name="cmd">0:关机;1:重启;2:注销</param>
57 public static void ShutdownComputer(int cmd)
58 {
59 switch (cmd)
60 {
61 case 0:
62 DoExitWin(EWX_FORCE | EWX_POWEROFF);
63 break;
64 case 1:
65 DoExitWin(EWX_FORCE | EWX_REBOOT);
66 break;
67 case 2:
68 DoExitWin(EWX_FORCE | EWX_LOGOFF);
69 break;
70 }
71 }
72
73 }

三、计算机无法关机的原因

许多计算机无法进行正常关机,如下图所示:

对于此现象可以按照如下步骤解决:

(1)使用杀毒软件确定是否有病毒。病毒会阻止关机程序的执行,破坏注册表中的相关选项或系统文件,杀毒将包含病毒的系统文件清除的问题。

(2)禁用阻止关机功能。开始”→“运行”,在“运行”对话框中输入“gpedit.msc”,然后点击“确定”按钮。在“组策略”窗口中,双击“管理模板”→“任务 栏和「开始」菜单”,然后双击右侧的“删除和阻止访问‘关机’命令”。在“删除和阻止访问‘关机’命令属性”窗口中,点击“设置”选项卡,选择“已禁 用”,然后点击“确定”按钮。

(3)关闭关机自检。开始”→“运行”,在“运行”对话框中输入“gpedit.msc”,然后点击“确定”按钮。在“组策略”窗口中,双击“管理模板”→“任务 栏和「开始」菜单”,然后双击右侧的“关闭会阻止或取消关机的应用程序的自动终止功能”,双击弹出属性对话框,在这里将默认的“未配置”更改为“已启用”,确认之后即可生效。 这样一来,相关的应用程序就不会在关机期间自动终止,可加快关机速度,不过也有可能导致应用程序的数据丢失。https://www.kafan.cn/edu/85550102.html

(4)禁用快速关机。快速关机是Windows 98中的新增功能,可以大大减少关机时间。但是,该功能与某些硬件不兼容,假如计算机中安装了这些硬件,可能会导致计算机休止响应。可禁用快速关机,先单击“开始”→“运行”,在“打开”框中键入“Msconfig”,然后单击“确定”(见图1)。单击“高级”→“禁用快速关机”,单击“确定”,再次单击“确定”。系统提示重新启动计算机,可重新启动。假如计算性能正常关机,则快速关机功能可能与计算机上所安装的一个或多个硬件设备不兼容。https://www.cixi8.com/yulu/103552.html

(5)检查一下声音文件是否正常。如果你的win7系统在关机的时候设置了退出声音的话,那么一旦声音文件发生损坏的时候,就会导致计算机无法关闭,所以要检查一下系统的声音文件是否正常。打开控制面板,然后再控制面板中找到并双击“声音和多媒体”项;在打开界面中,切换到“声音”选项卡下,然后选中“声音事件”中的“退出Windows”选项,接着再将“名称”设置为无,这样就能取消关机时的声音了;然后尝试关闭计算机,如果在取消声音之后,能够正常关闭的话就说明是声音文件造成的,那如果是这个原因的话就要重新安装一下声音文件的应用程序,或者也可以从备份文件中进行恢复,简单的方法是直接将关机声音取消即可。http://www.win7zhijia.cn/jiaocheng/win7_1296.html

(6)关机前提前关闭可能导致系统无法关机的进程,例如“rundll32”类进程,可加速关机速度:https://jingyan.baidu.com/article/cd4c2979269130756e6e60ee.html

C# 关机/重启/注销计算机的更多相关文章

  1. Linux关机重启注销(3)

    1.关机重启 shutdown shutdown -h now :立即关机 shutdown -h 1 now :一分钟后关机 shutdown -r now :立即重启 halt:关机 reboot ...

  2. linux基础_关机重启注销

    1.关机重启命令 (1)shutdown shutdown -h now:表示立即关机 shutdown -h 1:表示1分钟后关机 shutdown -r  now:立即重启 (2)halt:就是直 ...

  3. C# 操作电脑 关机 重启 注销 休止 休眠

    // 关机 强制电脑10秒之内关机 //System.Diagnostics.Process.Start("shutdown", "-s -f -t 10"); ...

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

    在Windows系统中有2种方式进行关机.重启以及注销计算机操作: 1.使用shutdown()命令:2.使用系统API: 以下是使用系统API进行操作的实例. 程序实例界面: 程序实例代码: 1 u ...

  5. C# 实现系统关机、注销、重启、休眠、挂起

    原文:C# 实现系统关机.注销.重启.休眠.挂起 核心代码如下: using System; using System.Text; using System.Diagnostics; using Sy ...

  6. Linux系统 关机/重启/用户切换/注销,用户管理(用户创建/修改,用户组增加/删除),Linux中 / 和 ~ 的区别

    1.关机/重启命令 shutdown命令 shutdown -h now :立即关机 shutdown -h 1 :1分钟后关机 shutdown -r now :立即重启 shutdown -r 1 ...

  7. mfc标题栏 菜单 退出 关机 重启

    隐藏标题栏 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStru ...

  8. 第3章 Linux常用命令(6)_关机重启命令

    8. 关机重启命令 8.1 关机重启命令 (1)shutdown [选项] 时间     ①选项 -c:取消前一个关机命令 -h:关机 -r:重启 ②应用举例:#shutdown –h now.shu ...

  9. 让Android程序获得系统的权限,实现关机重启,静默安装等功能

    引用:http://www.cnblogs.com/welenwho/archive/2012/05/10/2494984.html android想要获得系统权限有几种途径,一种就是你的程序固化的系 ...

  10. linux学习4 网络命令和关机重启

    网络命令 write write 用户名 回车后输入信息 以 ctrl+d 保存结束 wall wall [message] //that is all,发送给所有人 ping ping 选项 IP地 ...

随机推荐

  1. [从产品角度学EXCEL 02]-EXCEL里的树形结构

    这是<从产品角度学EXCEL>系列第三篇. 前言请看: 0 为什么要关注EXCEL的本质 1 excel是怎样运作的 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布 ...

  2. 从SqlServer转手Oracle的一些坑

    为将SqlSugar ORM转制成OracleSugar ORM 本想一天搞定,凭着经验不看任何Oracle资料就直接强上了,但是从配置PLSQL和一些语法区别带来了很多坑让我进度放缓 这个贴子对于身 ...

  3. Android下添加新的自定义键值和按键处理流程

            Android下添加新的自定义键值和按键处理流程     说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我 ...

  4. csharp: Data binding in WPF DataGrid control

    <Window x:Class="WpfProjectDemo.MainWindow" xmlns="http://schemas.microsoft.com/wi ...

  5. Mysql 模糊匹配和转义字符

    首先创建一个测试表: insert into test(tt) values('\\\\172.18.28.153'); 现在我想使用模糊匹配,查出以 “\\172” 开头的字符串. 需要使用like ...

  6. Model的绑定

    ReflectedControllerDescriptor:ControllerDescriptor Controller的 public override ActionDescriptor Find ...

  7. codechef [snackdown2017 Onsite Final] Fusing Weapons

    传送门 题目描述 大厨最近迷上了一款勇者斗恶龙的游戏. 游戏每局开始前,会有 N 件武器摆成一圈.每件武器有一个整数的等级.大厨可以选择两件 相邻的等级相同(不妨设同为 A 级)的武器,将它们合成.这 ...

  8. 使用 Appium 测试微信小程序 Webview

    打开调试功能 通过微信打开debugx5.qq.com,或者直接扫下面二维码   勾选[打开TBS内核Inspector调试功能]   Chrome查看页面元素 手机连接电脑,查看是否连接成功.如下展 ...

  9. 面试题:反转字符串(leetcode344)

    编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这一问题. 你可以 ...

  10. R8500 MPv2 版本 刷梅林改版固件

    由于R8500折腾起来比较繁琐.并且国内的koolshare上已经有人释出梅林改版移植的固件,主要是***更方便了,所以把R8500刷成了梅林固件,这是我第一次用上梅林固件. 刷机整个过程参考了下面的 ...