Внешний вид сайта:

Ввод пароля, когда приложение восстанавливается из панели задач

Предположим, что у Вас есть приложение с важными данными и Вы не хотели бы, чтобы посторонние работали с этими данными. Такое приложение может автоматически сворачиваться в панель задач, если нет активности пользователя.

Когда приложение будет восстановлено (при нажатии на кнопку на панели задач), будет отображено диалоговое окно ввода пароля для доступа к приложению.

Форма ввода пароля

Диалоговое окно ввода пароля должно появлятся перед тем, как приложение восстановится из панели задач. Событие OnRestore не годится для этого. Событие OnRestore объекта TApplication возникает, когда приложение восстанавливается до нормального состояния.

Обратите внимание: когда восстанавливается. Даже если бы Вы смогли свернуть приложение, вызвав метод Application.Minimize внутри события Application.OnRestore, окно успеет моргнуть, а это нам не надо.

HookMainWindow возникает раньше, чем OnRestore

У TApplication есть метод HookMainWindow, который позволяет вставлять собственный обработчик сообщений, которые будут выполняться перед обработкой событий объекта.

HookMainWindow объявлен в TApplication так:

procedure HookMainWindow(Hook : TWindowHook);

Где указатель на метод HookMainWindow объявлен так:

type
   TWindowHook = function(
                 var Message: TMessage): Boolean of object;

Обработка SC_RESTORE WM_SYSCOMMAND, используя HookMainWindow

Убедитесь, что Вы удалите ловушку, когда объект будет уничтожен.

Главное при обработке SC_RESTORE отобразить модальное окно ввода пароля и возвратить True, если пользователь может продолжить работу после восстановления приложения.

Пример кода приложения:

unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    function AppHook(var msg: TMessage): boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.AppHook(var msg: TMessage): boolean;
begin
  result:= false;
  if (msg.Msg = WM_SYSCOMMAND) and (msg.WParam = SC_RESTORE) then
    result:= MessageDlg(
              'Вы Администратор?', mtWarning, [mbYes,mbNo], 0) = mrNo;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.HookMainWindow(AppHook);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Application.UnhookMainWindow(AppHook);
end;

end.

Комментарии

Нет комментариев. Ваш будет первым!