編程實現Windows關機、重啟、登出

來源:互聯網
上載者:User

標籤:html   登出   exit   告訴   ret   get   名稱   api   明強   

要想編程使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

編程實現Windows關機、重啟、登出

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.