实现这一功能很简单,主要需要调用一个系统API

ExitWindowsEx

功能就是,注销当前用户,关闭系统,或者重新启动系统。

它会发送一个WM_QUERYENDSESSION消息给所有的应用程序,让他们决定是不是可以被关闭。

函数原型:

  1. <span style="font-size:18px;">BOOL WINAPI ExitWindowsEx(
  2. __in UINT uFlags,
  3. __in DWORD dwReason
  4. );
  5. </span>
第一个参数是关闭类型,第二个是关闭的原因

第一个参数可以是:

EWX_LOGOFF
0

EWX_POWEROFF
0x00000008

EWX_REBOOT
0x00000002

EWX_RESTARTAPPS
0x00000040

EWX_SHUTDOWN
0x00000001

这个参数还可以可选的包含下面两个值

EWX_FORCE
0x00000004       包含这个参数可以让系统强制关机,可能会让应用程序丢失数据

EWX_FORCEIFHUNG
0x00000010

如果在超时时间以后应用进程仍然没有响应WM_QUERYENDSESSION或WM_ENDSESSION消息,那么就强制关闭它们。

返回值:

成功的话返回非0值,失败返回0

可以通过GetLastError()获得更多错误信息。

除了了解这个函数以外,我们还应该清楚:

对于windows NT以上版本的操作系统,我们需要提升一个SE_SHUTDOWN权限,才能完成关机的操作。

NT一下的则不需要,例如95,98,ME

NT以上的系统包括:

Microsoft Windows 2000 (Windows NT 5.0) (1999) (2000-2010) 
Microsoft Windows XP (Windows NT 5.1) (2001-2014) 
Microsoft Windows Server 2003 (Windows NT 5.2) (2003-2015) 
Microsoft Windows Server 2003 R2 (Windows NT 5.2) (2006-2015) 
Microsoft Windows Vista (Windows NT 6.0) (2006-2017) 
Microsoft Windows Server 2008 (Windows NT 6.0) (2008-2018) 
Microsoft Windows 7 (Windows NT 6.1) (2009-2020) 

下面我们开始具体实现:

关机功能实现

1.检查系统版本,看是不是NT以上,如果是则要提升权限

2.调用系统API,ExitWindowsEx。

  1. #pragma region 功能实现
  2. BOOL ReSetWindows(DWORD dwFlags,BOOL bForce)
  3. {
  4. //检查参数是否正确
  5. if(dwFlags!=EWX_LOGOFF&&dwFlags!=EWX_REBOOT&&dwFlags!=EWX_SHUTDOWN)
  6. return FALSE;
  7. //获得系统的版本信息,让我们后面确定是否需要提升系统权限
  8. OSVERSIONINFO osvi={0};
  9. //获得参数的大小,以提供给GetVersionEx来判断这是一个新版本的OSVERSIONINFO,还是旧版本的
  10. //新版本是OSVERSIONINFOEX。扩充版本
  11. osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
  12. if(!GetVersionEx(&osvi))
  13. {
  14. return FALSE;
  15. }
  16. //检查操作系统的版本,如果是NT类型的系统,需要提升系统权限
  17. if(osvi.dwPlatformId==VER_PLATFORM_WIN32_NT)
  18. {
  19. //EnableShutDownPriv();
  20. }
  21. //判断是否是强制关机,强制关闭系统进程。
  22. dwFlags|=(bForce!=FALSE)?EWX_FORCE:EWX_FORCEIFHUNG;
  23. //调用API
  24. returnExitWindowsEx(dwFlags,0);
  25. }
提升权限的代码:
  1. #pragma region 用来提升系统权限
  2. //这是一个通用的提升权限函数,如果需要提升其他权限
  3. //更改LookupPrivilegeValue的第二个参数SE_SHUTDOWN_NAME,即可
  4. BOOL EnableShutDownPriv()
  5. {
  6. HANDLE hToken=NULL;
  7. TOKEN_PRIVILEGES tkp={0};
  8. //打开当前程序的权限令牌
  9. if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
  10. {
  11. return FALSE;
  12. }
  13. //获得某一特定权限的权限标识LUID,保存在tkp中
  14. if(!LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid))
  15. {
  16. CloseHandle(hToken);
  17. return FALSE;
  18. }
  19. tkp.PrivilegeCount=1;
  20. tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
  21. //调用AdjustTokenPrivileges来提升我们需要的系统权限
  22. if(!AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(TOKEN_PRIVILEGES),NULL,NULL))
  23. {
  24. CloseHandle(hToken);
  25. return FALSE;
  26. }
  27. return TRUE;
  28. }
调用方法:
  1. ReSetWindows(EWX_LOGOFF,false);//注销
  2. ReSetWindows(EWX_REBOOT,true);//重启
  3. ReSetWindows(EWX_SHUTDOWN,true);//关机
具体见自己代码,参见附件。
文章摘自:
http://blog.csdn.net/zy_dreamer/article/details/8948880

附件列表

windows C++实现注销、重启、关机 logoff reboot shutdown的更多相关文章

  1. C/C++控制Windows关机/注销/重启的正确姿势

    简介 说到代码控制Windows关机/注销/重启的方式,有很多种,最简单的不过就是控制命令行,使用system("pause")函数执行一个shutdown -s -t 0,关机就 ...

  2. linux注销、关机、重启

    一.Logout 注销是登陆的相对操作,登陆系统后,若要离开系统,用户只要直接下达logout命令即可:[root@laolinux root]#logoutRed Hat Linux release ...

  3. linux注销开关机

    注销:exit 重启:reboot shutdown-r 表示延时分钟数   关机:halt shut -h  

  4. linux基本命令-注销、关机、重起

    链接地址:http://blog.163.com/bhao_home/blog/static/6647763120081202047945/ 一.注销,关机,重启 注销系统的logout命令 1,Lo ...

  5. Linux 登录、注销与关机

    Linux 登录.注销与关机 这里主要学习的是命令行环境下的相关操作. 一.登录 Linux 默认的情况下会提供六个终端来让用户登录,切换的方式为使用:[Ctrl + Alt + F1 ~ F6]的组 ...

  6. Windows 8 自带定时关机的4种实现方法

    问题描述:前几天发布了一篇文章[ Windows 7/8 自带定时关机命令 ],文章中的用到的命令我在Windows 7都运行成功,但没有在Windows 8 上进行测试,因为我认为Windows 8 ...

  7. linux杂记(五)正确关机方法(shutdown,reboot,init,halt)

    前言:由于在linux底下,每个程序(或者说是服务)都是在背景下运行的,因此,在你看不到的屏幕背后其实可能有相当多人同时在你的主机上面工作,如果 你直接按下电源开关来关机,则可能导致其他人的数据就此中 ...

  8. Ubuntu重启关机命令使用

    如果你想保持当前用户的登录而且使用root用户执行命令 可以输入:su root,输入密码 可以运行,shutdown 命令 重启命令: 1.reboot 2.shutdown -r now 立刻重启 ...

  9. Linux下关机命令的区别 (halt,poweroff,reboot,shutdown,init)

    1.shutdown shutdown命令安全地将系统关机.    而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭.并且login指令会被冻结﹐即新的用户不能再登录 ...

随机推荐

  1. 机器学习笔记----Fuzzy c-means(FCM)模糊聚类详解及matlab实现

    前言:这几天一直都在研究模糊聚类.感觉网上的文档都没有一个详细而具体的讲解,正好今天有时间,就来聊一聊模糊聚类. 一:模糊数学 我们大家都知道计算机其实只认识两个数字0,1.我们平时写程序其实也是这样 ...

  2. C3P0连接池配置和实现详解

    一.配置 <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数.Default: 3 --> ...

  3. centos 6.4 getmail 收取163 邮件

    #CentOS 6.6 64bit 默认yum 源没有getmail rpm包#首先安装EPEL yum 源EPEL(Extra Packages for Enterprise Linux):http ...

  4. IL2CPP

    [官方教程] IL2CPP 深入讲解系列介绍 (汇总帖) http://forum.china.unity3d.com/forum.php?mod=viewthread&tid=8960&am ...

  5. Node.js API 初解读(二)

    四. Cluster 1.简介 在介绍 Cluster 之前.我们需要知道 node的 一些基本特性,比如说 都知道的 nodejs最大的特点就是单进程.无阻塞运行,并且是异步事件驱动的. 那么随之而 ...

  6. SQL 删除索引错误

    SQL Server 数据库执行 ”DROP INDEX 索引名 ON 表名“ 时出现“不允许对索引 '索引名' 显式地使用 DROP INDEX.该索引正用于 PRIMARY KEY 约束的强制执行 ...

  7. CSS 高级布局技巧

    随着 IE8 逐渐退出舞台,很多高级的 CSS 特性都已被浏览器原生支持,再不学下就要过时了. 用 :empty 区分空元素 兼容性:不支持 IE8 /*假如我们有以上列表:*/ <div cl ...

  8. 【IOS】将字体大小不同的文字底部对齐

    从WP转IOS了,还是放不下...... 在项目中,要实现如图多个不同大小的文字   底部对齐的效果   像下面这样: (想要的效果) 以为用三个UIFont不同的UILabel  之后让他们底部对齐 ...

  9. oracle DDL(数据定义语言)基本语句

    --创建表格 create table  production( ProductIdvarchar2(10), ProductNamevarchar2(20), ProductPricenumber( ...

  10. Load Test Analyzer Overview

    reference url: https://msdn.microsoft.com/en-us/library/ms404677.aspx