アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (4件)

★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 や方法を『この回答へのお礼』に記述して
 くれませんか?お願いします。
    • good
    • 0
この回答へのお礼

今回の件では、ありがとうございました。
ウインドープロシージャー内に組み込んでみます。
そこで、お礼になるかどうか?下記の方法しか知りません。
ご存知でしたらごめんなさい。
以前に何処かで検索したのですが・・・記憶がありません。

HANDLEhToken;
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)かを選択するものである。

お礼日時:2007/03/10 14:56

★情報提供、有り難うございました。


・これから『SetSystemPowerState』関数について調べたいと思います。
・『OpenProcessToken』、『LookupPrivilegeValue』、『AdjustTokenPrivileges』の部分は
 私が知っている方法と同じようです。
・休止状態、スタンバイは『SetSystemPowerState』API関数のようですね。
 7777777v さん有り難うございます。

最後に:
・この質問に回答して良かったです。
・以上。おわり。→私も自作ソフトに『休止状態』、『スタンバイ』機能を組み込みます。

参考URL:http://www.winapi-database.com/Message/WM/index. …
    • good
    • 0

★回答者 No.1 さんへの補足。


・既に『無効』に設定していても何故か『エラー報告ダイアログ』が表示されることがあります。
 これはかなり重度の高い致命的エラーの場合です。→この場合は表示されてしまうようです。
・また自動的に閉じる機能は標準(Windows機能)ではありませんね。

最後に:
・ソフトを自作できるのであれば、勝手に終了されないように出来ますよ。→ただし、
 タスクマネージャの強制終了を選択すると、そちらが優先されますので阻止は難しいです。
・通常の終了ダイアログと同じ『シャットダウン・再起動』での終了ならば阻止できます。
 ただし、阻止できるようにするには、自作ソフトを作成できればのお話ですよ。
・以上。おわり。→自作できる場合はアドバイスします。

この回答への補足

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

補足日時:2007/03/09 18:26
    • good
    • 0

マイコンピューター>プロパティ>詳細設定>エラー報告>無効にする



でいけばいいですよ。エラー報告はされません。
    • good
    • 0
この回答へのお礼

解決しました・・・
ありがとうございました。

Windowsは便利でも設定箇所が多くて・・・迷い込んでしまいます。

お礼日時:2007/03/09 18:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!