Windows 7上で動作するWin32コンソールアプリケーションの早すぎる終了をブロックする適切な方法は何ですか?Win32コンソールアプリケーションでShutdownBlockRequestCreateを使用する
Vistaが導入されたとき、どのように変更されましたかApplication Shutdownが発生しました。ユーザーが強制終了するかどうかを要求するUIを開くXPの動作とは対照的に、Windows Vista(および7)は、プログラムによって何も防止されない場合、プロセスを終了します。トップレベルのウィンドウが表示されていないコンソールアプリケーションやアプリケーションでは、新しい機能ShutdownBlockRequestCreateを使用して、Vistaが表示されるUIにポップアップが表示される理由を提示するか、または5秒後にプログラムを終了させる必要があります。
以下は、Win32コンソールアプリケーションでShutdownBlockRequestCreate関数を使用する試みです。プリコンパイルされたヘッダーオプションは、ウィザードの作成後にプロジェクトから削除されました。関数を使用するたびに、ERROR_ACCESS_DENIEDに対応するエラーコード5が返されます。これは明らかに(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
喜んで助けてください。 :) –