API函數:ExitWindowsEx(Long uFlags,Long dwReserved );
uFlags : 指定下述一個或多個標誌(用OR運算子合并到一起)
EWX_FORCE 強迫中止沒有響應的進程
EWX_LOGOFF 中止進程,然後登出
EWX_SHUTDOWN 關掉系統電源(如果可能的話,ATX電源就可以)
EWX_REBOOT 重新引導系統
EWX_SHUTDOWN 關閉系統
dwReserved : 保留,設為零
註:(1)這個函數調用後會立刻返回,系統關閉過程是在後台進行的。注意先中止自己的應用程式,使關閉過程更顯平順。當然,您的進程必須有足夠的優先權,否則也不能執行這種操作;
(2)2000以上系統要提升許可權,下面是提升許可權的函數
1)BOOL MySystemShutdown(ff)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE );
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges [0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
return FALSE;
// Shut down the system And force all applications to close.
if (!ExitWindowsEx(ff, 0)) /* 這裡改 EWX_SHUTDOWN 為EWX_REBOOT */
return FALSE;
return TRUE;
}
2)bool MyExitWindowsEx(UINT uFlag)
{ OSVERSIONINFO osv;
osv.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&osv);
if(osv.dwPlatformId==VER_PLATFORM_WIN32_NT){
HANDLE hProcess,hToken;
TOKEN_PRIVILEGES Privileges;
LUID luid;
hProcess=GetCurrentProcess();
OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken);
Privileges.PrivilegeCount=1;
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
Privileges.Privileges[0].Luid=luid;
Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL);
}
ExitWindowsEx(uFlag,0);
}
案例:
void __fastcall TForm1::BnOKClick(TObject *Sender)
{
OSVERSIONINFO ovi;
ovi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if(GetVersionEx(&ovi))
{
if(ovi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken))
{
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, false, &tkp, 0, NULL, 0);
}
}
}
unsigned int m = EWX_SHUTDOWN;
if(RbPowerOff->Checked) //選擇了關機
m|=EWX_POWEROFF;
else if(RbReboot->Checked) //選擇了重新啟動
m|=EWX_REBOOT;
else if(RbLogoff->Checked) //選擇了登出
m|=EWX_LOGOFF;
ExitWindowsEx(m,0); //執行選擇的命令
Close();
}