OSシャットダウン時の終了処理の書き方

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
Papa

OSシャットダウン時の終了処理の書き方

#1 投稿記事 by Papa »

OSのシャットダウン時に、プログラムの終了処理をしたいのですが、
どうすればできますか?(AB4.24です。)

WM_QUERYENDSESSIONを使えば良さそうなのですが、その先がわかりません。
よろしくお願いいたします。
たかせ
記事: 217
登録日時: 2006年2月05日(日) 17:10
お住まい: 東京都

Re: OSシャットダウン時の終了処理の書き方

#2 投稿記事 by たかせ »

とりあえずコールバック関数を以下の様に記載すれば実現できます。
ちなみにWindows10でしょうか?

'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数

Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
SELECT CASE dwMsg
CASE WM_QUERYENDSESSION
'Windows シャットダウン処理
MessageBox(hMainWnd,"Windows10(1909) シャットダウンします","TEST",MB_OK)
CASE ELSE
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
END SELECT
End Function

そこでWindows7とWindows10(1909)でテストしました。

Windows7では問題なく動作します。

Windows10の場合シャットダウンするとシャットダウン自体が中断されます。
なので期待通りに動作しないと思います。
まあ実行すればわかりますが。

ご確認願います。
よろしくお願いいたします。
PaPa

Re: OSシャットダウン時の終了処理の書き方

#3 投稿記事 by PaPa »

たかせ様

アドバイスありがとうございます。
環境はWin10です。

調べてみましたら、下記手順が必要な感じです。

1、WM_QUERYENDSESSIONにてFALSEを戻す。
2、WM_ENDSESSIONにて処理する。

下記の様に書いてみましたがFALSEを戻す所でWinowsがエラーを返します。
戻し方を教えて頂きませんか?

宜しくお願い致します。
たかせ
記事: 217
登録日時: 2006年2月05日(日) 17:10
お住まい: 東京都

Re: OSシャットダウン時の終了処理の書き方

#4 投稿記事 by たかせ »

AB4.24ですよね?

CASE WM_QUERYENDSESSION
return FALSE

上記で記載だと一つ気になった点があります。
「return FALSE」の部分です。
おそらくC/C++のコーディング例を参考にされたと思います。
AB4.24の場合はGOSUB命令でサブルーチンを呼びだしRETURN命令により呼び出し元に復帰します。
GOSUB命令やRETURN命令についての詳細はABのヘルプを参照してください。
なので
CASE WM_QUERYENDSESSION
return FALSEを

CASE WM_QUERYENDSESSION
MainWndProc=FALSEに

変更すると良いと思いますが?
ご確認お願いします。
よろしくお願いいたします。