2011-07-07 24 views
2

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; 
}; 

答えて

2

回避策として、起動時にメッセージ専用ウィンドウを作成し、そのウィンドウハンドルにShutdownBlockReasonCreateを使用できますか?

+0

これは魅力的な回避策です。私が仕事に戻るときに私は調査します。 – Atreys

+0

これは、ShutdownBlockReasonCreateメソッドを使用する請求書に適合します。ありがとう! – Atreys

+0

喜んで助けてください。 :) –

0

コンソールウィンドウをCSRSSサブシステムではなく、あなたのコンソールプログラムによって所有されているため、これは、コンソールプログラムからコンソールウィンドウハンドルを渡すために意味がありません。さらに、コンソールをフルスクリーンテキストモードで実行するとどうなりますか?誰が何を所有しているかにかかわらず、今はコンソールの周りにも窓がありません!

NULLhWndを渡しますか?

編集:コンソールプログラムが独自の隠しウィンドウを作成し、それを使用するとどうでしょうか?

+0

'ShutdownBlockReasonCreate(NULL、" msg ")'の呼び出しには、ERROR_ACCESS_DENIEDという同様のエラーコードがあります。私は、あなたが問題の要点に触れると思う:コンソールプログラムは、HWNDに基づいてシャットダウンシャットダウンの理由を提供するように要求されていることは、私にとって非常に疑わしいと思われる。コンソールウィンドウを生成するexe(アイコンをダブルクリックするか、アイコンをダブルクリックする)を実行するたびに、タイトルとボタンを持つウィンドウが他のウィンドウと同じようにサイズ変更されます。私がコマンドラインからexeを走らせるなら、私はコンソールの周りの窓を考えるのは喜ばないだろう。 – Atreys

関連する問題