4

赤い十字で閉じると非表示になるアプリケーションがあります。ユーザーは、トレイ アイコンを右クリックし、[終了] を選択して終了できます。しかし、それは明らかにウィンドウのシャットダウンをブロックするので、WM_QUERYENDSESSION に応答して閉じることができるようにする手順を作成しました。これは関連するコードです:

procedure TMainForm.OnWindowsEnd(var Msg: TMessage); // responds to message WM_QUERYENDSESSION;
begin
  AllowClose:=true;
  Close;
end;

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:=AllowClose;
  if NOt AllowClose then
    Hide;
end;

しかし、奇妙なことが起こり続けます。シャットダウンを発行すると、このアプリケーションは正常に終了します。しかし、それだけです。2 回目のシャットダウンを発行すると、システムは正常に終了します。(WinXPでこれをテストしています)。

原因は何ですか?ありがとうございました


ANSWER コードは次のようになります

procedure TMainForm.OnWindowsEnd(var Msg: TMessage); // responds to message WM_ENDSESSION;
begin
  // Possible checking for flags, see http://msdn.microsoft.com/en-us/library/aa376889%28v=vs.85%29.aspx
  AllowClose:=true;
  Msg.Result:=1;
end;

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:=AllowClose;
  if NOt AllowClose then
    Hide;
end;
4

1 に答える 1

9

WM_QUERYENDSESSIONは「クエリ」であり、シャットダウン コマンドではありません。Windows は、シャットダウンしても問題ないかどうかを尋ねますが、シャットダウンするようには求めません。電話してはいけませんClose

第 2 に、Windows はメッセージを処理するときに TRUE を返すことを期待しているため、シャットダウンの可能性があっても問題がないことがわかります。結果をTRUEに設定していないため、Windowsは最初のシャットダウン要求を中止します。

于 2011-07-07T11:37:50.397 に答える