博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程实现Windows关机、重启、注销
阅读量:7085 次
发布时间:2019-06-28

本文共 2272 字,大约阅读时间需要 7 分钟。

要想编程使Windows关机、重启或者注销,可以使用ExWindowsEx这个API函数,该函数只有两个参数,第一个表示关机动作的标志,也就是你要让该函数关机呢,还是重启,还是注销等。可以使用EWX_SHUTDOWN、EWX_REBOOT、EWX_LOGOFF等标志常量,分别表示关机、重启、注销。另外如果加上EWX_FORCE这个标志常量的话,该表明强制执行该操作。Windows在执行以上操作的时候会首先给每个正在运行中的程序发送一个WM_QUERYENDSESSION消息,告诉它们现在我要退出系统了,你们赶快保存东西啊!如果这时候其中有某一个程序对该消息回应了“不”,系统就不会再执行以上操作了。而如果指定了EWX_FORCE标志,系统则不会发送消息去询问各个程序了,而是直接强制关闭所有程序,退出系统。所以说当指定了EWX_FORCE标志的时候要小心,因为这样做可能会丢失一些东西。(比如文件可能会没保存)。第二参数是保留参数,可能直接传递0值。另外,当在Win2K以上的操作系统执行关机和重启操作时,需要调用该函数的进程首先获得关机特权,不然函数会调用失败。

#include <windows.h>
//使能关机特权函数 BOOL EnableShutdownPrivilege() {     HANDLE hProcess = NULL;     HANDLE hToken = NULL;     LUID uID = {0};     TOKEN_PRIVILEGES stToken_Privileges = {0};
    hProcess = ::GetCurrentProcess();  //获取当前应用程序进程句柄          if(!::OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken))  //打开当前进程的访问令牌句柄(OpenProcessToken函数调用失败返回值为零)         return FALSE;
    if(!::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&uID))  //获取权限名称为"SeShutdownPrivilege"的LUID(LookupPrivilegeValue函数调用失败返回值为零)         return FALSE;
    stToken_Privileges.PrivilegeCount = 1;  //欲调整的权限个数     stToken_Privileges.Privileges[0].Luid = uID;  //权限的LUID     stToken_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  //权限的属性,SE_PRIVILEGE_ENABLED为使能该权限          if(!::AdjustTokenPrivileges(hToken,FALSE,&stToken_Privileges,sizeof stToken_Privileges,NULL,NULL))  //调整访问令牌里的指定权限(AdjustTokenPrivileges函数调用失败返回值为零)         return FALSE;
    if(::GetLastError() != ERROR_SUCCESS)  //查看权限是否调整成功         return FALSE;
    ::CloseHandle(hToken);     return TRUE; }
//关机函数 BOOL Shutdown(BOOL bForce) {     EnableShutdownPrivilege();  //使能关机特权函数     if(bForce)         return ::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0);  //强制关机     else         return ::ExitWindowsEx(EWX_SHUTDOWN,0); }
//注销函数 BOOL Logoff(BOOL bForce) {     if(bForce)         return ::ExitWindowsEx(EWX_LOGOFF | EWX_FORCE,0);  //强制注销     else         return ::ExitWindowsEx(EWX_LOGOFF,0); }
//重启函数 BOOL Reboot(BOOL bForce) {     EnableShutdownPrivilege();  //使能关机特权函数     if(bForce)         return ::ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0);  //强制重启     else         return ::ExitWindowsEx(EWX_REBOOT,0); }
int main() {     Logoff(FALSE);  //注销     Reboot(FALSE);  //重启     Shutdown(FALSE);  //关机     Logoff(TRUE);  //强制注销     Reboot(TRUE);  //强制重启     Shutdown(TRUE);  //强制关机     return 0; }

另外可参考:http://www.sharejs.com/codes/cpp/6256

http://wenku.baidu.com/view/b668afd028ea81c758f578f4.html

转载于:https://www.cnblogs.com/fengshulxt/p/7615475.html

你可能感兴趣的文章
Oracle数据库重复数据删除的三种情况
查看>>
clearfix清除浮动
查看>>
文件的基本操作
查看>>
Java运算符使用
查看>>
基本数据类型,包装类型,String类型数据之间的转换
查看>>
网络出口 NAT 配置实例
查看>>
C#如何进行多线程编程
查看>>
Exchange 日常管理之一:用户邮箱完全访问权限
查看>>
CloudStack 由于【辅助】二级存储名称配置错误引发的SSVM创建失败
查看>>
Android Studio - 第四十四期 倒计时
查看>>
负载均衡集群中如何隐藏VIP
查看>>
CUDA编程接口:使用nvcc编译器的兼容性
查看>>
IOS学习——UI基础UIWindow、UIView(五)
查看>>
Silverlight MMORPG《窝窝世界》游戏视频
查看>>
Oracle VM VirtualBox上安装windows server2008R2做SharePointServer2010开发(下
查看>>
数据收集利器 cAdvisor - 每天5分钟玩转 Docker 容器技术(82)
查看>>
<rhel6+pptpd+freeradius+mysql>
查看>>
前端有哪些优质资源可以利用?
查看>>
[ASP.NET]跨页面传值
查看>>
名词:topology、architecture和struct,究竟什么才是架构?
查看>>