阻止在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;
};
這是一個誘人的解決方法。我會調查什麼時候回去工作。 – Atreys
這適合使用ShutdownBlockReasonCreate方法的帳單。謝謝! – Atreys
很高興幫助。 :) –