TrayIconコンポーネントを使って常駐するプログラムを作っています。内容はタイマーイベントで一定時間おきに処理をするものです。起動するとタスクトレイに常駐するようになりましたが、このままWindowsをシャットダウンしようとするとシャットダウンできません。このプログラムを終了しておけば正常にシャットダウンできます。プログラム側でシャットダウンされたことを検知して自分自身を終了するような処理をしたいと思います。どうしたらよいでしょうか?
そういうアプリよく書きますが、
普通にシャットダウンできると思いますよ。
どういうコード書いてます?
とりあえずシャットダウンを検知できるようにするには
こんな感じでしょう。
もしかしたら、Formを使わないアプリケーションになっているのかな?
TMainForm = class(TForm)
private
FQueryEndSession: Boolean;
FEndSessionLogOff: LongInt;
procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QUERYENDSESSION;
public
{ Public 宣言 }
end;
procedure TMainForm.WMQueryEndSession(var Msg:TWMQueryEndSession);
begin
FQueryEndSession := true;
FEndSessionLogOff := Msg.Unused;
inherited;
end;
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if FQueryEndSession then begin
FQueryEndSession := false;
if (FEndSessionLogOff and ENDSESSION_LOGOFF) <> 0 then
begin
// ログオフ要求時の処理
WriteFileRunningTimeData('プログラム終了'+TAB+'ログオフ');
end
else begin
// シャットダウン要求時の処理
WriteFileRunningTimeData('プログラム終了'+TAB+'シャットダウン');
end;
end
else begin
// 上記以外でフォームを閉じる要求時の処理
WriteFileRunningTimeData('プログラム終了'+TAB+'通常');
end;
if CanClose then
begin
end;
end;
Fusaさん、ありがとうございます。シャットダウンやログオフを検知する方法は大変勉強になりました。
で、問題の元に戻りますが、CloseQueryにCanClose := falseが書いてあったのが原因とわかりました。このメソッドはWindowsのシャットダウンすら妨げる強力さがあるんですね。教えていただいた情報と共に記録しておきます。
ツイート | ![]() |