タスクトレイに常駐するプログラムを作成しています。
フォームは設定画面をメインフォームとしているだけで、
通常は Hide の状態になっています。
[×]ボタンをクリックしてもプログラムが終了しないように、
FormCloseQuery で下記のように CanClose を制御しています。
procedure TfMainform.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
Self.Hide;
if(ShutdownClose)then
CanClose := True
else
CanClose := False;
end;
上記の ShutdownClose: boolean は、起動時に False になり、
WM_ENDSESSION や WM_QUERYENDSESSION を受信すると Trueに
なるようになっています。
//Windows終了時の処理
procedure TfMainform.WMEndSession(var Msg: TMessage);
begin
ShowMessage('WMEndSession');
ShutdownClose := True;
Close;
end;
//Windowsの終了を検知する
procedure TfMainform.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
ShowMessage('WMQueryEndSession');
Self.Hide;
SimpleTray.DelTray;
Msg.Result := 1;
ShutdownClose := True;
end;
スタートボタンをクリックしてシャットダウンを行うと、
メッセージボックスが表示され、プログラムは終了します。
ここまでは期待通りなのですが、Windows のシャットダウン処理が
そこで止まってしまい、画面が表示されたままで一向に終了しません。
プロセスを表示するツールで見たところ、プログラムはきれいに
終了しているようです。タスクトレイのほかのアイコンは、
スピーカを除いて全て消えています。
ShowMessage() を外して何も表示しないようにしたところ、
シャットダウンで私のプログラムが終了するとき BEEP が
鳴っているようでしたが、何の音なのかはわかりません。
私のプログラムを常駐させていないときは、サクッと終了します。
私のプログラムがシャットダウン処理の何かを妨害しているようにも
思うのですが、どうしたらよいのかわかりません。
何かアドバイスをいただけないでしょうか。
SimpleTray.DelTray;だけコメントアウトして試しましたが、
シャットダウン、ログオフ共に問題なく終了しました。
Delphi7 on WinXp sp2
ツイート | ![]() |