windows C++实现注销、重启、关机 logoff reboot shutdown
实现这一功能很简单,主要需要调用一个系统API
ExitWindowsEx
功能就是,注销当前用户,关闭系统,或者重新启动系统。
它会发送一个WM_QUERYENDSESSION消息给所有的应用程序,让他们决定是不是可以被关闭。
函数原型:
<span style="font-size:18px;">BOOL WINAPI ExitWindowsEx(__in UINT uFlags,__in DWORD dwReason);</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以上的系统包括:
下面我们开始具体实现:
关机功能实现
1.检查系统版本,看是不是NT以上,如果是则要提升权限
2.调用系统API,ExitWindowsEx。
#pragma region 功能实现BOOL ReSetWindows(DWORD dwFlags,BOOL bForce){//检查参数是否正确if(dwFlags!=EWX_LOGOFF&&dwFlags!=EWX_REBOOT&&dwFlags!=EWX_SHUTDOWN)return FALSE;//获得系统的版本信息,让我们后面确定是否需要提升系统权限OSVERSIONINFO osvi={0};//获得参数的大小,以提供给GetVersionEx来判断这是一个新版本的OSVERSIONINFO,还是旧版本的//新版本是OSVERSIONINFOEX。扩充版本osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);if(!GetVersionEx(&osvi)){return FALSE;}//检查操作系统的版本,如果是NT类型的系统,需要提升系统权限if(osvi.dwPlatformId==VER_PLATFORM_WIN32_NT){//EnableShutDownPriv();}//判断是否是强制关机,强制关闭系统进程。dwFlags|=(bForce!=FALSE)?EWX_FORCE:EWX_FORCEIFHUNG;//调用APIreturnExitWindowsEx(dwFlags,0);}
#pragma region 用来提升系统权限//这是一个通用的提升权限函数,如果需要提升其他权限//更改LookupPrivilegeValue的第二个参数SE_SHUTDOWN_NAME,即可BOOL EnableShutDownPriv(){HANDLE hToken=NULL;TOKEN_PRIVILEGES tkp={0};//打开当前程序的权限令牌if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken)){return FALSE;}//获得某一特定权限的权限标识LUID,保存在tkp中if(!LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid)){CloseHandle(hToken);return FALSE;}tkp.PrivilegeCount=1;tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;//调用AdjustTokenPrivileges来提升我们需要的系统权限if(!AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(TOKEN_PRIVILEGES),NULL,NULL)){CloseHandle(hToken);return FALSE;}return TRUE;}
ReSetWindows(EWX_LOGOFF,false);//注销ReSetWindows(EWX_REBOOT,true);//重启ReSetWindows(EWX_SHUTDOWN,true);//关机
附件列表
windows C++实现注销、重启、关机 logoff reboot shutdown的更多相关文章
- C/C++控制Windows关机/注销/重启的正确姿势
简介 说到代码控制Windows关机/注销/重启的方式,有很多种,最简单的不过就是控制命令行,使用system("pause")函数执行一个shutdown -s -t 0,关机就 ...
- linux注销、关机、重启
一.Logout 注销是登陆的相对操作,登陆系统后,若要离开系统,用户只要直接下达logout命令即可:[root@laolinux root]#logoutRed Hat Linux release ...
- linux注销开关机
注销:exit 重启:reboot shutdown-r 表示延时分钟数 关机:halt shut -h
- linux基本命令-注销、关机、重起
链接地址:http://blog.163.com/bhao_home/blog/static/6647763120081202047945/ 一.注销,关机,重启 注销系统的logout命令 1,Lo ...
- Linux 登录、注销与关机
Linux 登录.注销与关机 这里主要学习的是命令行环境下的相关操作. 一.登录 Linux 默认的情况下会提供六个终端来让用户登录,切换的方式为使用:[Ctrl + Alt + F1 ~ F6]的组 ...
- Windows 8 自带定时关机的4种实现方法
问题描述:前几天发布了一篇文章[ Windows 7/8 自带定时关机命令 ],文章中的用到的命令我在Windows 7都运行成功,但没有在Windows 8 上进行测试,因为我认为Windows 8 ...
- linux杂记(五)正确关机方法(shutdown,reboot,init,halt)
前言:由于在linux底下,每个程序(或者说是服务)都是在背景下运行的,因此,在你看不到的屏幕背后其实可能有相当多人同时在你的主机上面工作,如果 你直接按下电源开关来关机,则可能导致其他人的数据就此中 ...
- Ubuntu重启关机命令使用
如果你想保持当前用户的登录而且使用root用户执行命令 可以输入:su root,输入密码 可以运行,shutdown 命令 重启命令: 1.reboot 2.shutdown -r now 立刻重启 ...
- Linux下关机命令的区别 (halt,poweroff,reboot,shutdown,init)
1.shutdown shutdown命令安全地将系统关机. 而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭.并且login指令会被冻结﹐即新的用户不能再登录 ...
随机推荐
- 关于ACM的总结
看了不少大神的退役帖,今天终于要本弱装一波逼祭奠一下我关于ACM的回忆. 从大二上开始接触到大三下结束,接近两年的时间,对于大神们来说两年的确算不上时间,然而对于本弱来说就是大学的一半时光.大一的懵懂 ...
- svn error
svn: E205009: Local, non-commit operations do not take a log message or revision properties svn copy ...
- jquery tree
<div class="fl left" id="nav" style="width:18%" > ...
- 报错:init: Could not find wglGetExtensionsStringARB!
如下操作即可恢复:
- A()方法
A方法用于在内部实例化控制器,调用格式:A('[项目://][分组/]模块','控制器层名称')最简单的用法: $User = A('User'); 复制代码 表示实例化当前项目的UserActi ...
- PHP数组常用函数
[官方]PHP Array 函数 一.数组操作的基本函数 数组的键名和值 array_values($arr); 获得数组的值 array_keys($arr); 获得数组的键名 array_fl ...
- bind绑定参数
const curry = (fn) => (...args)=>fn.bind(null,...args); const split = curry((splitOn, str) =&g ...
- Sql Server中查询今天、昨天、本周、上周、本月、上月数据
Sql Server中查询今天.昨天.本周.上周.本月.上月数据 在做Sql Server开发的时候有时需要获取表中今天.昨天.本周.上周.本月.上月等数据,这时候就需要使用DATEDIFF()函数及 ...
- Bootstrap table使用心得
序号显示带分页信息的连续编号,在序号列添加以下格式化代码即可. { field: 'number', title: '序号', align:'center', width:45, formatter: ...
- Java性能调优之:idea变慢解决
今天搬砖的时候遇到一个问题,idea总是卡死,完全无法愉快的玩耍.幸好机器是Linux系统的.于是通过以下方式解决了问题: 通过top命令,查看系统运行状态发现4个CPU中有1个CPU用户占用率为10 ...