• ベストアンサー

Windowsの「問題が発生・・・ご不便」のダイアログを非表示にしたい。

正常なプログラムでもWindowsに勝手に終了させられて、困っています。 この機能を解除出来ないでしょうか? 又は、報告しない選択でダイアログを自動的に閉じることは出来ないでしょうか? ご存知の方、ご教授よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★Windows の終了阻止について ・ポイントは『WM_QUERYENDSESSION』メッセージです。→知っていましたか? ・プロシージャ関数内で上記のメッセージをキャッチして『0』をリターンすれば終了を  阻止できます。→『DefWindowProc』では通常『1』を返します。『1』をリターンすれば  Windows が終了できることになります。ただし、他のソフトで『0』をリターンしていれば  Windows は終了処理を中止します。 ・『WM_QUERYENDSESSION』メッセージは Windows が終了するときに、全てのウィンドウに  送られるため、どれか1つのソフト(自作ソフトなど)が『0』をリターンすれば終了を  阻止できることになるのです。→すごく簡単です。 サンプル1:ウインドウの場合 case WM_QUERYENDSESSION:  return( 0 ); サンプル2:ダイアログの場合 case WM_QUERYENDSESSION:  SetWindowLong( hDlg, DWL_MSGRESULT, 0 );  return( TRUE ); ※ダイアログの場合は、SetWindowLong 関数で『DWL_MSGRESULT』を指定して『0』を返して下さい。 最後に: ・関連メッセージとして『WM_ENDSESSION』があります。  このメッセージは『WM_QUERYENDSESSION』で終了可能とされたとき(1をリターンしたとき)に  送られてきます。つまり『WM_QUERYENDSESSION』メッセージで『1』をリターンした場合に  その結果を『WM_ENDSESSION』に伝える事になります。ですから『0』をリターンしていた場合は  『WM_ENDSESSION』メッセージは発生しないことになります。 ・以上。おわり。 お願い: ・私は Windows のシャットダウン、再起動、ログオフなどの ExitWindowEx() 関数を使った終了は  ミニソフトなどに組み込んで使っていますが、『休止状態(H)』、『スタンバイ(S)』の方法が  分からずにいます。もしよければ参考になる URL や方法を『この回答へのお礼』に記述して  くれませんか?お願いします。

7777777v
質問者

お礼

今回の件では、ありがとうございました。 ウインドープロシージャー内に組み込んでみます。 そこで、お礼になるかどうか?下記の方法しか知りません。 ご存知でしたらごめんなさい。 以前に何処かで検索したのですが・・・記憶がありません。 HANDLE hToken; TOKEN_PRIVILEGES tknPri; // アクセストークンを開く if ( OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) == FALSE ) {} // ローカル一意識別子と特権名を取得 if ( LookupPrivilegeValue( NULL,SE_SHUTDOWN_NAME,&(tknPri.Privileges[0].Luid) ) == FALSE ) {} tknPri.PrivilegeCount = 1; tknPri.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // アクセストークンを有効にする if ( AdjustTokenPrivileges( hToken,FALSE,&tknPri,0,NULL,NULL ) == FALSE ) {} // shutdown後、電源を切る //if ( ExitWindowsEx( EWX_POWEROFF,0 ) == FALSE ) {} //#define EWX_LOGOFF 0 //#define EWX_SHUTDOWN 1 //#define EWX_REBOOT 2 //#define EWX_FORCE 4 //#define EWX_POWEROFF 8 //休止 if ( SetSystemPowerState( 0,FALSE) == FALSE ) {} //第1パラメータは 0=休止 ; 1=スタンバイ //第2パラメータは 各アプリケーションに //サスペンドしても良いか問い合わせる(FALSE)か、 //強制的にサスペンドする(TRUE)かを選択するものである。

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★情報提供、有り難うございました。 ・これから『SetSystemPowerState』関数について調べたいと思います。 ・『OpenProcessToken』、『LookupPrivilegeValue』、『AdjustTokenPrivileges』の部分は  私が知っている方法と同じようです。 ・休止状態、スタンバイは『SetSystemPowerState』API関数のようですね。  7777777v さん有り難うございます。 最後に: ・この質問に回答して良かったです。 ・以上。おわり。→私も自作ソフトに『休止状態』、『スタンバイ』機能を組み込みます。

参考URL:
http://www.winapi-database.com/Message/WM/index.html
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★回答者 No.1 さんへの補足。 ・既に『無効』に設定していても何故か『エラー報告ダイアログ』が表示されることがあります。  これはかなり重度の高い致命的エラーの場合です。→この場合は表示されてしまうようです。 ・また自動的に閉じる機能は標準(Windows機能)ではありませんね。 最後に: ・ソフトを自作できるのであれば、勝手に終了されないように出来ますよ。→ただし、  タスクマネージャの強制終了を選択すると、そちらが優先されますので阻止は難しいです。 ・通常の終了ダイアログと同じ『シャットダウン・再起動』での終了ならば阻止できます。  ただし、阻止できるようにするには、自作ソフトを作成できればのお話ですよ。 ・以上。おわり。→自作できる場合はアドバイスします。

7777777v
質問者

補足

回答者:Oh-Orangeさん ありがとうございます・・・ 私はVC++で休止の実行ファイルを作ってデスクトップに貼り付けて、休止を1クリックで簡単にできるようにしています。 今のところ、本件は解決していますが、今後の勉強のためにアドバイスを頂ければ幸いです。

  • fuchihiro
  • ベストアンサー率25% (35/140)
回答No.1

マイコンピューター>プロパティ>詳細設定>エラー報告>無効にする でいけばいいですよ。エラー報告はされません。

7777777v
質問者

お礼

解決しました・・・ ありがとうございました。 Windowsは便利でも設定箇所が多くて・・・迷い込んでしまいます。

関連するQ&A