实现这一功能很简单,主要需要调用一个系统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
返回值:
成功的话返回非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 ; -
//调用API -
return ExitWindowsEx ( 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 ); //关机
附件列表
原文:http://www.cnblogs.com/xiahaimq/p/6235679.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!