重ねてのアドバイスに感謝いたします。
次の2通りを試しましたが、どちらもうまく行きませんでした。
*** その1 **********************************************************************
タイマーを使った、アドバイスを頂いた方法です。
Windowsの終了を検知できず、コピーしないで終了してしまいます。
procedure TMAINForm.TimerTimer(Sender: TObject);
begin
Timer.Enabled := FALSE;
CopyFiles;
Close;
end;
PROCEDURE TMAINForm.WndProc
( VAR Msg : TMessage );
BEGIN
IF Msg.Msg = WM_ENDSESSION THEN BEGIN
ShutdownBlockReasonCreate
( Handle,
PWideChar('バックアップをしています。しばらくお待ち下さい。'));
Timer.Enabled := TRUE;
END(* of IF *);
INHERITED;
END(* WndProc *);
PROCEDURE TMainForm.WMQueryEndSession
( VAR Msg : TWMQueryEndSession );
BEGIN
Msg.Result := LongInt( ORD( FALSE ) );
INHERITED;
END(* WMQueryEndSession *);
*** その2 **********************************************************************
本来は、設定されたフラグを元に、FormCloseQuery内でコピーを実行していましたので、それを改変してみました。
Windows8.1ではコピーの途中で、Windowsに戻ってしまいます。状況は改善されていません。さらに、メッセージが正しく表示されず、「次のアプリケーションがシャットダウンを妨げています。」と、デフォルト?のメッセージが表示されます。
procedure TMAINForm.FormCloseQuery
( Sender : TObject;
var CanClose : Boolean );
begin
IF CopyRequested THEN BEGIN
CopyFiles;
END;
CanClose := TRUE;
end(* FormCloseQuery *);
PROCEDURE TMAINForm.WndProc
( VAR Msg : TMessage );
BEGIN
IF Msg.Msg = WM_ENDSESSION THEN BEGIN
ShutdownBlockReasonCreate
( Handle,
PWideChar('バックアップをしています。しばらくお待ち下さい。'));
CopyRequested := TRUE;
Close;
END(* of IF *);
INHERITED;
END(* WndProc *);
PROCEDURE TMainForm.WMQueryEndSession
( VAR Msg : TWMQueryEndSession );
BEGIN
Msg.Result := LongInt( ORD( FALSE ) );
INHERITED;
END(* WMQueryEndSession *);
|