Как отловить завершение сессии пользователя?
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QUERYENDSESSION;
procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION;
end;
implementation
var
FileName: string;
procedure TForm1.FormCreate(Sender: TObject);
begin
FileName := ExtractFilePath(ParamStr(0)) + 'log.txt';
if not FileExists(FileName) then
CloseHandle(FileCreate(FileName));
end;
// Сообщение WM_ENDSESSION отправляется в приложение после того, как система
// обрабатывает результаты сообщения WM_QUERYENDSESSION. Сообщение WM_ENDSESSION
// сообщает приложению о завершении сеанса.
procedure TForm1.WMEndSession(var Msg: TWMEndSession);
var
f: TextFile;
begin
AssignFile(f, FileName);
Append(f);
Writeln(f, 'WM_ENDSESSION ' + IntToStr(Msg.Unused));
case TMessage(Msg).LParam of
0: Writeln(f, 'система завершает работу или перезапускается'#13);
ENDSESSION_CLOSEAPP:
// Приложение использует файл, который необходимо заменить,
// система обслуживается или системные ресурсы исчерпаны.
// Если wParam имеет значение TRUE, приложение должно завершить
// работу. Все данные должны сохраняться автоматически без запроса
// пользователя (дополнительные сведения см. в примечаниях).
// Диспетчер перезапуска отправляет это сообщение, если приложение
// использует файл, который необходимо заменить, когда он должен
// обслуживать систему или когда системные ресурсы исчерпаны.
// Приложение будет перезапущено, если оно зарегистрировано для
// перезапуска с помощью функции RegisterApplicationRestart.
Writeln(f, 'ENDSESSION_CLOSEAPP'#13);
ENDSESSION_CRITICAL:
// Приложение принудительно завершает работу.
Writeln(f, 'ENDSESSION_CRITICAL'#13);
ENDSESSION_LOGOFF:
// Пользователь отключается.
Writeln(f, 'ENDSESSION_LOGOFF'#13);
end;
CloseFile(f);
// if Msg.EndSession then
// Сеанс завершается...
inherited;
end;
// Сообщение WM_QUERYENDSESSION отправляется, когда пользователь выбирает
// завершение сеанса или когда приложение вызывает одну из функций завершения
// работы системы. Если любое приложение возвращает ноль, сеанс не завершается.
// Система перестает отправлять сообщения WM_QUERYENDSESSION , как только одно
// приложение возвращает ноль.
//
// После обработки этого сообщения система отправляет сообщение WM_ENDSESSION
// с параметром wParam, установленным в результаты сообщения WM_QUERYENDSESSION.
procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
var
f: TextFile;
begin
AssignFile(f, FileName);
Append(f);
Writeln(f, 'WM_QUERYENDSESSION');
case TMessage(Msg).LParam of
0: Writeln(f, 'система завершает работу или перезапускается'#13);
ENDSESSION_CLOSEAPP:
// Приложение использует файл, который необходимо заменить,
// система обслуживается или системные ресурсы исчерпаны.
Writeln(f, 'ENDSESSION_CLOSEAPP'#13);
ENDSESSION_CRITICAL:
// Приложение принудительно завершает работу.
Writeln(f, 'ENDSESSION_CRITICAL'#13);
ENDSESSION_LOGOFF:
// Пользователь отключается.
Writeln(f, 'ENDSESSION_LOGOFF'#13);
end;
CloseFile(f);
inherited;
Msg.Result := 1;
end;
|