概述
要想编程使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 ;
}
// 使能关机特权函数
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 ;
}
转载于:https://www.cnblogs.com/ZYM/archive/2008/04/14/1152901.html
最后
以上就是着急大侠为你收集整理的编程实现Windows关机、重启、注销的全部内容,希望文章能够帮你解决编程实现Windows关机、重启、注销所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复