トップページ > 記事閲覧
Windowsがシャットダウンされようとしてるかを取得したい
名前: 日時: 2016/08/02 02:21

ソフトを終了するときに、ファイルへの書き込みを行いたいのですが、ソフトが起動したままシャットダウンやログオフを行ってしまうと、最後の処理ができません。 メインループの直後に処理を置くと、閉じるボタンを押したときには実行されるのですが、起動したままシャットダウンやログオフをすると実行されません。 どうにかこれを解決したいのですが、何か方法はあるでしょうか。 Windowsがシャットダウンされようとしているかを確認する関数とかないのでしょうか…。
メンテ

Page: 1 |

Re: Windowsがシャットダウンされようとしてるかを取得したい ( No.1 )
名前:初期状態 日時:2016/08/02 23:40

おそらく不可能だと思われます。。 Windowsがシャットダウンするときに取っている確認は 強制終了、すなわちMain関数の最後まで行く前に処理を中断してもいいかの確認です MSが作ったエクセルなどのソフトウェアも、シャットダウンの確認のときに「強制的にシャットダウン」を選んでしまうと ファイルを保存出来なくなってしまっています(だからこそ確認を取っているのですが) office等では妥協案として、定期的にデータのバックアップを行っています 一定時間に一度、保存したいデータを出力するようにしたらいかがでしょうか? 毎フレーム(1/60秒おきに)ファイルにアクセスするのは処理が重いので、 作っているソフトやゲームの用途や出力するファイルサイズから適切な周期を考えてください 編集系のソフトなら10分から1時間程度、ゲームなら20秒から1分が妥当ではないかと思います
メンテ
Re: Windowsがシャットダウンされようとしてるかを取得したい ( No.2 )
名前: 日時:2016/08/03 04:58

しかし、シャットダウンをするとき、エクセル側で「強制的にシャットダウン」をするか選ばせられるということは、エクセルはWindowsがシャットダウンされようとしているか確認できているはずです。 つまり、どうにかして確認することはできると思うのですが…。 強制終了のときは処理できなくてもいいのですが、正常なログオフ、及びシャットダウンが確認できればなと考えています、 Windowsの仕様上、直接関数で確認できないのであれば、コールバック関数を使う形でもいいのでどうにか対応させる方法はないのでしょうか。。。
メンテ
Re: Windowsがシャットダウンされようとしてるか ( No.3 )
名前:Tir 日時:2016/08/04 12:57

SetAlwaysRunFlagがオフでも機能するかはわかりませんが GetWindowActiveFlagなどでメインウィンドウがアクティブじゃない時に保存などではダメでしょうか?
メンテ
Re: Windowsがシャットダウンされようとしてるかを取得したい ( No.4 )
名前: 日時:2016/08/04 21:54

GetWindowActiveFlagを使ってしまうと、シャットダウンをしていないときでも実行されてしまいます。 というのも、ウィンドウが非アクティブになるのはシャットダウン時のみだけではないので…
メンテ
Re: Windowsがシャットダウンされようとしてるかを取得したい ( No.5 )
名前:yumetodo 日時:2016/08/04 22:08

イベントハンドラのWM_DESTROYってそういう処理書けたりしないのかな・・・。できるか知りませんが (そもそもシャットダウンの時ってkillコマンドと同じことしている気がするんですが、そのときイベントハンドラ呼ばれるのかな)
メンテ
Re: Windowsがシャットダウンされようとしてるかを取得したい ( No.6 )
名前:ねこ 日時:2016/08/04 22:34

当方winapiに詳しくないので的外れな事かもしれませんが こちらのサイトなど参考になるのではないでしょうか ttp://unarist.hatenablog.com/entry/2015/06/01/235908
メンテ
Re: Windowsがシャットダウンされようとしてるかを取得したい ( No.7 )
名前: 日時:2016/08/04 22:58

WM_ENDSESSIONのメッセージを取得したらできると思うのですが、DXライブラリを使っているときにこういった類のメッセージを取得するにはどうすればいいのでしょう。。 WinAPIはほとんどわからないので解決策がわかりません...
メンテ
Re: Windowsがシャットダウンされようとしてるかを取得したい ( No.8 )
名前:yumetodo 日時:2016/08/05 18:36

ちょっとガバガバですが https://github.com/yumetodo/DxLib_own_create_window こんな風に自力でプロージャーかけます
メンテ
Re: Windowsがシャットダウンされようとしてるかを取得したい ( No.9 )
名前:葱(解決) 日時:2016/08/06 16:08

自作プロシージャかけてみたのですが、DXライブラリの関数であるCheckKeyInputの機能が使えなかったり、アイコンが正常に変わらなかったり、マウスの座標の取得がうまくいかなかったりで、既にほとんどコードが出来上がっているところに自作プロシージャを追加して正常に動かすのは厳しそうです。。 DXライブラリが生成したウィンドウのメッセージを取得する方法がないのであれば仕方ありません、今回シャットダウンを検知するのは諦めます、、(そもそもWinAPIとは無縁でいたいがためにDXライブラリを使っているわけで…) しかし、シャットダウンを検知することを前提で、WinAPIを意識しつつもコードを組むとき、yumetodoさんのGitHubを参考に、自作プロシージャを作成すれば検知できそうなので、今回は解決とさせていただきたいと思います。お騒がせしましたm(_ _)m
メンテ
Re: Windowsがシャットダウンされようとしてるかを取得したい ( No.10 )
名前:管理人 日時:2016/08/07 04:46

> Windowsの仕様上、直接関数で確認できないのであれば、コールバック関数を使う形でもいいのでどうにか対応させる方法はないのでしょうか。。。 シャットダウンやログオフの際に呼ばれるコールバック関数を登録するための関数を追加してみましたので、 よろしければこちらをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 以下の関数を追加しました // シャットダウンによるソフトの強制終了の際に呼ばれるコールバック関数を登録する // ( Message はコールバック関数の終了を待つ間表示されるメッセージ ) int SetShutdownCallbackFunction( void (* CallbackFunction )( void * ), void *Data, char *Message ) ; こちらの関数でコールバック関数を登録しておくと、シャットダウンやログオフによってソフトが終了 されそうになった際に登録したコールバック関数が呼ばれます ( 第二引数の Data がコールバック関数の引数として渡されます ) コールバック関数が実行されている間はソフトは終了されず、タスクマネージャには引数の Message で 指定した文字列が表示されます こちらの関数を使用して、ログオフやシャットダウンがされそうになった際にコールバック関数内で 10秒間ただ待つというプログラムを組んでみましたので、よろしければご覧ください m(_ _)m #include "DxLib.h" // ログオフやシャットダウン時に呼ばれる関数 void CallbackFunction( void *Data ) { // 10秒待つだけ Sleep( 10000 ) ; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // ログオフやシャットダウン時に呼ばれるコールバック関数登録 SetShutdownCallbackFunction( CallbackFunction, NULL, "コールバック呼び出し中…" ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; // 文字列の描画 DrawString( 0, 0, "ログオフやシャットダウンをするとコールバック関数が呼ばれます", GetColor( 255,255,255 ) ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: Windowsがシャットダウンされようとしてるかを取得したい ( No.11 )
名前:葱(解決) 日時:2016/08/07 17:39

すみません、わざわざ新しい関数まで作っていただきありがとうございます。 お陰様で希望の動作を実装することができました。 ありがとうございましたm(_ _)m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存