2011-07-07 90 views
2

阻止在Windows 7上運行的Win32控制檯應用程序提前終止的正確方法是什麼?在Win32控制檯應用程序中使用ShutdownBlockRequestCreate

當引入Vista時,發生了Application Shutdown的變化。與XP中的行爲相反,即打開UI以請求用戶是否要強制關閉,Windows Vista(和7)終止該過程,如果沒有任何事情以編程方式完成以防止它。沒有頂級窗口可見的控制檯應用程序和應用程序還必須使用新功能ShutdownBlockRequestCreate來提供Vista在彈出的UI中顯示的原因,或者它會在5秒後終止程序。

以下是我在Win32控制檯應用程序中使用ShutdownBlockRequestCreate函數的嘗試;在嚮導創建之後,預編譯頭選項已從項目中刪除。無論何時使用函數,我都會得到錯誤代碼5,對應於ERROR_ACCESS_DENIED。這顯然是(根據Application Shutdown link),因爲我沒有從用於創建窗口(控制檯窗口)的同一線程調用該函數。

#include <iostream> 
#include <tchar.h> 
#include <conio.h> 
#include <windows.h> 

typedef BOOL (WINAPI *SBRCREATEFUNC)(HWND,LPCWSTR); 

void RegisterShutdownBlockReason() { 
    SBRCREATEFUNC ShutdownBlockReasonCreate; 
    HWND hWnd = GetForegroundWindow(); 
    HINSTANCE hinstLib = LoadLibrary(TEXT("user32.dll")); 
    if (hinstLib != NULL) { 
     ShutdownBlockReasonCreate = (SBRCREATEFUNC) GetProcAddress(hinstLib,"ShutdownBlockReasonCreate"); 
     if(ShutdownBlockReasonCreate != NULL) { 
      if(!(ShutdownBlockReasonCreate) (hWnd, L"Terminating Communication Sessions")) { 
       printf("\nfailed To Register Reason, failure code: %d\n", GetLastError()); 
      } else { 
       printf("\nRegistered Reason\n"); 
      } 
     } else { 
      printf("\nCouldn't load ShutdownBlockReasonCreate procedure\n"); 
     } 
    } else { 
     printf("\nFailed to LoadLibrary(\"user32.dll\")\n"); 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) { 
    RegisterShutdownBlockReason(); 
    printf("Type to terminate program.\n"); 
    getch(); 
    return 0; 
}; 

回答

2

作爲一種解決方法,您可以在啓動時創建僅消息窗口,並在其窗口句柄上使用ShutdownBlockReasonCreate

+0

這是一個誘人的解決方法。我會調查什麼時候回去工作。 – Atreys

+0

這適合使用ShutdownBlockReasonCreate方法的帳單。謝謝! – Atreys

+0

很高興幫助。 :) –

0

從控制檯程序傳遞控制檯窗口句柄沒有意義,因爲控制檯窗口由CSRSS子系統擁有,而不是控制檯程序。此外,如果您的控制檯以全屏文本模式運行,該怎麼辦?不管誰擁有什麼,現在甚至沒有一個窗口在你的控制檯周圍!

它會讓你通過一個NULLhWnd

編輯:好的,那麼,如果您的控制檯程序創建自己的隱藏窗口,並使用它呢?

+0

調用'ShutdownBlockReasonCreate(NULL,「msg」)''有一個類似的錯誤代碼ERROR_ACCESS_DENIED。不過,我想你應該關注問題的癥結所在:控制檯程序被要求提供阻止基於HWND關機的理由,這對我來說似乎是非常可疑的。每當我運行產生控制檯窗口的exe文件(帶有快捷方式或雙擊圖標)時,*就是一個帶有標題和按鈕的窗口,可以像調整其他窗口一樣調整窗口大小。如果我要從命令行運行exe,那麼我不太願意想到圍繞控制檯的窗口。 – Atreys

相關問題