概況
函式原型:
BOOLExitWindowsEx(
UINTuFlags, // 關閉參數
DWORDdwReserved // 系統保留,一般取0
);
參數
uFlags
參數:uFlags
指定關閉的類型。此參數必須有下列值的組合:
EWX_FORCE
強制終止進程。當此標誌設定,Windows不會傳送訊息WM_QUERYENDSESSION和WM_ENDSESSION的訊息給目前在系統中運行的程式。這可能會導致應用程式丟失數據。因此,你應該只在緊急情況下使用此標誌。
EWX_LOGOFF
關閉所有進程,然後註銷用戶。
EWX_POWEROFF
關閉系統並關閉電源。該系統必須支持斷電。
Windows要求:
Windows NT中調用進程必須有 SE_SHUTDOWN_NAME 特權。
Windows 9X中:可以直接調用。
EWX_REBOOT
關閉系統,然後重新啟動系統。
Windows要求:
Windows NT中:調用進程必須有SE_SHUTDOWN_NAME特權。
Windows 9X中:可以直接調用。
EWX_SHUTDOWN
關閉系統,安全地關閉電源。所有檔案緩衝區已經刷新到磁碟上,所有正在運行的進程已經停止。
Windows要求:
Windows NT中:調用進程必須有SE_SHUTDOWN_NAME特權。
Windows 9X中:可以直接調用。
參數:dwReserved
保留,這參數被忽略。一般取0。
返回值
如果函式成功,返回值為非零。
如果函式失敗,返回值是零。想獲得更多錯誤信息,請調用GetLastError函式。
備註
ExitWindowsEx函式返回後,啟動了關閉。關閉或註銷。
在關機或登錄操作中,應用程式在允許關閉的時間具體數額內回應關機請求。如果時間到期時,Windows會顯示一個對話框,允許用戶強行關閉應用程式:關閉、重試,或取消關機要求。如果存在EWX_FORCE指定值,Windows會關閉應用程式而不顯示該對話框。
Windows NT中:關閉或重新啟動系統,調用進程必須使用AdjustTokenPrivileges函式使SE_SHUTDOWN_NAME特權。Windows 95中:安全特權,不支持或需要。
例子
Windows 9X:
ExitWindowsEx(EWX_SHUTDOWN, 0); //關閉系統
ExitWindowsEx(EWX_REBOOT, 0); //重啟系統
Windows NT/2000/XP:
以下給出一個函式
如果不是MFC,加入以下語句在該函式之前
#define BOOL int
#define TRUE 1
#define FALSE 0
如果是,直接加入
BOOL SystemShutdown()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
/* OpenProcessToken() 這個函式的作用是打開一個進程的訪問令牌
GetCurrentProcess() 函式的作用是得到本進程的句柄*/
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))
return FALSE;
//LookupPrivilegeValue()的作用是查看系統許可權的特權值,返回信息到一個LUID結構體裡。
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set 賦給本進程特權
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// AdjustTokenPrivileges()的作用是通知Windows NT修改本進程的權利
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS) //失敗
return FALSE;
if (!ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0)) //參數在這裡設定。強行退出WINDOWS(EWX_FORCE)。
return FALSE;
return TRUE;
}