一、调用 shutdown.exe 执行操作

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

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

二、使用 WInAPI 执行操作

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

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

    目录 1. 关机/重启命令 2. 用户切换/注销 2.1 基本说明 2.2 切换用户 2.3 注销用户 1. 关机/重启命令 # shutdown命令 shutdown -h now # 立即关机 s ...

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

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

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

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

随机推荐

  1. Eureka系列(五) 服务续约流程具体实现

    服务续约执行简要流程图   下面这张图大致描述了服务续约从Client端到Server端的大致流程,详情如下: 服务续约Client源码分析   我们先来看看服务续约定时任务的初始化.那我们的服务续约 ...

  2. k8s第二回之k8s集群的安装

    1. k8s集群的安装 目录 1. k8s集群的安装 1.架构: 2.环境准备 3.master节点安装etcd 4. master节点安装kubernetes 5.node节点安装kubernete ...

  3. 初接触matplotlib

    1,绘制简单的折线图. 1 import matplotlib.pyplot as plt 2 3 square = [1,4,9,16,25] 4 5 plt.plot(square) 6 plt. ...

  4. 浅析Python装饰器

    1.什么是装饰器 在介绍装饰器之前,我们先来思考一个问题:使用Python语言进行程序设计时,如果我们想扩展一个函数的功能,一般会怎么做呢? 比如,有一个名为print_info函数,当前该函数内只做 ...

  5. MySQL、DM 行转列及字段去重(Group_Concat())

    最近在使用数据库迁移适配,由MySQL 库迁移到达梦数据库,其中进行行转列时,MySQL转换达梦sql语法有些问题,特记录. 在MySQL 下有Group_Concat(expr)  ,在达梦及神通数 ...

  6. React Hook 入门使用

    React Hook 是什么 1.没有比官网说的更好的 HOOK 1. React Hook 官方 2. 用我们自己的话说,它是一个钩子函数,用来处理组件间的状态的一个方法,暂时理解为一个高阶函数吧. ...

  7. Android 自定义构建类型 BuildType

    简单介绍了 BuildType 定义在 app 项目与 module 项目的区别,以及在 Gradle 2.x 与 3.x 版本的区别. 最近接触到自定义构建类型 BuildType,发现这一块有些地 ...

  8. JDK下载地址 Oracle JDK下载 地址 (已解决)

    现在JDK开始收费了 Oracle官方对JDK的管理也变得严格了,现在想要在官网下载jdk需要先注册Oracle账号,这倒是小事但是网页反应慢注册填写内容复杂导致很多人不想注册. 不过有的人提供了公开 ...

  9. HTML表格样式

    一.表格的表头 1 <html> 2 3 <body> 4 5 <h4>表头:</h4> 6 <table border="1" ...

  10. kill的使用

    Linux中Kill进程的N种方法 (2011-12-23 17:27:59) 转载▼ 标签: 杂谈 分类: ubuntu系统操作 常规篇: 首先,用ps查看进程,方法如下: $ ps -ef -- ...