FAQ VCL
Windows

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как отловить завершение сессии пользователя?

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;


Как получить список поддерживаемых/установленных кодировок?

type
  TForm1 = class(TForm)
    {...}
    Memo1: TMemo;
    {...}
  end;

var
  Form1: TForm1;

implementation

function EnumCodePagesProc(lpCodePageString: PWideChar): LongBool; stdcall;
var
  cpinfo: TCPInfoEx;
begin
  Result := GetCPInfoEx(StrToInt(lpCodePageString), 0, cpinfo);

  if Result then
    Form1.Memo1.Lines.Add(cpinfo.CodePageName);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not EnumSystemCodePages(@EnumCodePagesProc, CP_SUPPORTED {CP_INSTALLED}) then
    ShowMessage('EnumSystemCodePages Error: ' + SysErrorMessage(GetLastError));
end;

При использовании материала - ссылка на сайт обязательна