• ベストアンサー

windows終了時のメッセージについて

いつもお世話になります。 VC++6.0MFCダイアログベースでデスクトップアプリ を作成しているものです。 アプリ終了でINIファイルにウィンドウ位置を記憶させ 次回起動時に終了位置に表示させているのですが、 アプリが立ち上がったまま、スタートメニューからウィンドウズ自体を 終了させた時、アプリにはどのようなメッセージが飛んできているのか どなたか教えていただけないでしょうか? よろしくお願い致します。

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

  • ベストアンサー
回答No.2

ユーザが Windowsの終了を選択したり、ExitWindows関数で終了された直後に、トップレベルウィンドウ(この場合ダイアログ)にWM_QUERYENDSESSION メッセージが来ます。 ダイアログでは CWnd::OnQueryEndSession ハンドラを定義してこのメッセージを処理します。 ハンドラには、Windowsを終了してもよければ TRUE を、終了を阻止する場合は FALSE を返すようにコードを書きます。 ダイアログがこのメッセージをハンドルしたら、次に WM_ENDSESSION メッセージが来ます。 ダイアログでは CWnd::OnEndSession ハンドラを定義してこのメッセージを処理します。 ハンドラの BOOL 引数 bEnding が TRUE なら、Windows は終了します。 FALSE なら、終了処理は中断されました。 INIファイルにデータを記録するなら、OnEndSession に TRUE がセットされた時に書き込みを行い、完了したらハンドラから return します。 この時、ウィンドウに WM_DESTROY が来ないかもしれません。 また、メッセージキューに WM_QUIT も来ないかもしれません。

その他の回答 (1)

  • JitF
  • ベストアンサー率42% (16/38)
回答No.1

WM_QUIT だったと思います。 記憶なのでちょっと自信無し(^^; 実験して見て下さい。

関連するQ&A

  • ダイアログの表示位置の保存

    MFCのダイアログベースでプロジェクトを作成し、 実行すると雛形のダイアログが画面中央に出現しますが、 このダイアログを任意の位置に動かし、ダイアログを閉じた後、 再実行した際に、前回終了時の位置に表示させるにはどのように実装すれば良いのでしょうか? なお、座標のデータなどは終了時にiniファイルに書き出しておき、 再起動時にそれを読み出す方法を考えています。 iniファイルへの読書きの方法については理解済みです。 お手数ですがご回答よろしくお願いします。 開発環境:VC++2005

  • ダイアログベースのウィンドウメッセージについて

    Win2kのVC++6.0 MFC ダイアログベースでのウィンドウメッセージ処理で困っています。 OnCharがダイアログでは認識できません。ウィンドウでは認識できます。 何か特別な処理が必要なのでしょうか?

  • キーボード入力について

    VC++6.0MFCのダイアログベースでデスクトップアプリを作成しています。 現状ですが、まずEscとEnterをクリックすると、 アプリが終了してしまいます。 なぜかわからないのですが、 そもそもキーボード入力を無効にしたいのです。 SetWindowsHookExというAPIを使えばできそうなんですが、 いかんせん、初心者でしてどの部分でどのような記述を すればいいのかがわかりません。 どなたかご教授ください。 よろしくお願いいたします。

  • 終了時の画面のちらつきについて

    環境:VC6(MFC)+WinXP CFormViewのOnInitialUpdate()の中で、モーダルダイアログを表示し、 条件が違ったら、プログラムを終了されたいのですが、終了は 出来るのですが、元のフォームが一瞬表示されてしまいます。 表示しないようにできないのでしょうか? (記述場所がいけない?) よろしくお願いします。

  • ダイアログ最前面表示時の後ろの画面操作について

    はじめまして。 お世話になります。 開発環境:WindowsXP VC++6.0 MFC使用 ダイアログベースで画面を作成(A.exe CDialogベース)し、その画面でボタンを押下し 子画面(A_Child)を表示させます。表示方法はDoModal()で。 そのA_ChildはCDialogベースです。 A_Childダイアログが表示されている間(最前面)は、デスクトップ上の操作を 何も出来ない様にしたいのですが、方法はありますでしょうか? (例:スタート→ログオフでダイアログが表示しますよね。 その時ってそのダイアログ以外は触れないですよね。) せめて、自分たちが作成したアプリだけでも操作不可能にしたいのです。 SetWindowPos()、ModifyStyle()、色々試しましたが上手くいきません。 DoModalで表示させるのがそもそもまちがいののでしょうか? 何か方法が有りましたらよろしくお願いします。 説明が下手ですみません。

  • VC++6.0 異常終了の調査方法

    環境:VC++6.0 MFC使用 ダイアログベースアプリケーション 使用PC:同一ソースをWin2000またはWinXPでリビルドして使用 です。 メインダイアログにメニューを実装し、あるメニュー項目を 選ぶと別のダイアログをDoModalで表示し、別のダイアログで「OK」を 押すとメインダイアログに処理が戻るようなソフトを作成しています。 別のダイアログは数種類あり、EDITボックスやコンボボックスなどを 配置しています。 ダイアログ切り替えの運用試験として、 あるダイアログを表示→閉じるを繰り返す試験を行っていると、 数時間でこのソフトが異常終了してしまいます。 (タイマ処理内で、現在日時分秒を出力しています) 「あるダイアログを表示」は、ソフトのタイマ処理で5秒おきにDoModalしています。 「閉じる」は、「OK」ボタンを押す別アプリを作成しています。 別アプリでは、「IsWindowVisible()の戻り値がTRUE」かつ 「FindWindowExを使用してlpszWindow(ウインドウ名)が「OK」」 のコントロールを探し出し、見つかればSendMessageなどで 「OK」ボタンを押す処理を代行させています。 何が原因で異常終了してしまうかを調べたいのですが、 具体的な良い方法はありませんでしょうか。 わかっている現象として、 1.タスクマネージャのプロセスタブで このソフトのメモリ使用量を見ていると、 時間とともに少しずつ増加しています。 よろしくお願いいたします。

  • Access Violationについて

    VC++6.0 MFCダイアログベースアプリを作成しているものです。 メインダイアログの他に別ダイアログを追加しようと思い、 新規にクラスを追加し、ダイアログを作成しました。 メインダイアログに終了ボタンがあり、押下することにより、 OnClose()を呼び、アプリを終了させています。 ここで、終了ボタンを押すと、以下のメッセージが表示されます。 ハンドルされていない例外は*****にあります。 0xC0000005: Access Violation 新規追加したクラス宣言部をコメントアウトすると、例外が発生しませんでした。 VC初心者でして、このエラーがメモリー関係では?とは想像がつくのですが、 どのようにアプリに影響しているのかがわかりません。 Access Violationが発生した時の対処法とかクラスを新規追加したことによる、 影響範囲がどの程度あるのか等、ご教授願えませんでしょうか? よろしくお願い致します。

  • VC++ Workerスレッドを強制終了させる方法

    VC++6.0でwinアプリを作っています。 ダイアログベースで、ボタンを押すとワーカースレッドを実行し、ここでデータ処理をしています。 もし、スレッド中でデータ処理時間がかかってしまうと、これをスレッド外で強制的に終了させたいですが、出来るのでしょうか。 よろしくお願いします。

  • アプリ起動時にダイアログも開くには?

    <環境> WIN98 VC++6.0 MFC SDIにて アプリ起動時に、SDIは非表示にしているおり、さらに同時にダイアログも非表示で開きたいのですが、ダイアログのコードはどこに書けばよいのでしょうか?

  • 終了時と同じウィンドウ位置で表示するには?

    付箋紙ソフトもどきを作っています。 ダイアログのボタン押し下げにて新たなウィンドウが何個も生成されるようになっています。 アプリを終了して再度起動すると、終了前に表示されていたウィンドウが終了前と同じ位置に表示されるようにしたいと思っています。 以下のコードでは、全てのウィンドウが同じ場所に表示されてしまいます。 どのようにすれば、各ウィンドウがそれぞれの元の位置に表示されるようにできますか? 各ウィンドウ毎に位置情報を保存、読出しするにはどうすれば良いのでしょうか? よろしくお願いします。 BOOL CMyWnd::kado_Create(CWnd* parent,CString m_InputData){ int nX,nY;//ウィンドウの位置を格納する変数 nX = GetPrivateProfileInt("Pos","X",0,"TSHANG2.INI"); nY = GetPrivateProfileInt("Pos","Y",0,"TSHANG2.INI"); 略 CreateEx( dwExStyle, lpszClassName, _T("Test"), dwStyle, rect, parent, NULL, NULL); 略 } void CMyWnd::OnDestroy() { int nX,nY;//ウィンドウの左上の座標を格納する変数 WINDOWPLACEMENT wp;//WINDOWPLACEMENT構造体 char szBuffer[32];//キーの値を格納する wp.length = sizeof(WINDOWPLACEMENT); ::GetWindowPlacement(m_hWnd,&wp); nX = wp.rcNormalPosition.left; nY = wp.rcNormalPosition.top; wsprintf(szBuffer,"%d",nX); WritePrivateProfileString("Pos","X",szBuffer,"TSHANG2.INI"); wsprintf(szBuffer,"%d",nY); WritePrivateProfileString("Pos","Y",szBuffer,"TSHANG2.INI"); 略 }