Карта сайтаСсылкиКонтакты

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

PDF Печать
Статьи

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

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

Что, если Вы должны отобразить диалог ввода пароля *перед* восстановлением приложения, чтобы удостовериться, что зарегистрированный пользователь обращается к нему.

Application.OnRestore - не подходит.

Объект TApplication генерирует событие OnRestore, когда свернутое приложение восстановлено до его нормального размера.

Обратите внимание: когда восстановлено, а не прежде, чем восстанавливается!

Конечно, Вы могли бы снова свернуть приложение, вызвав Application.Minimize внутри события Application.OnRestore, но все-таки будет некоторое мерцание формы, а мы этого не хотим. HookMainWindow - реагирует прежде, чем генерируется событие OnRestore.

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

HookMainWindow объявляется под TApplication как:


procedure HookMainWindow(Hook : TWindowHook) ;

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


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

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

Сначала, в OnCreate главной формы подключите ловушку.

Удостоверьтесь, что ловушка отключается, когда главная форма уничтожается.

Наиболее важно: дескриптор системной команды SC_RESTORE показывает модальный диалог ввода пароля и возвращает истину, если пользователь продолжает работать с приложением.


type
  TMainForm = class(TForm)
    procedure FormCreate(Sender: TObject) ;
    procedure FormDestroy(Sender: TObject) ;
  private
    function AppHook(var msg: TMessage): boolean;
  end;

implementation

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

function TMainForm.AppHook(var msg: TMessage): boolean;
begin
  result := false;
  if (msg.Msg = WM_SYSCOMMAND) and (msg.WParam = SC_RESTORE) then
    result := MessageDlg('Are you an Admin?', mtWarning, mbYesNo, 0) = mrNo;
end;

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

Это все!

Источник: http://delphi.about.com


 

Добавить комментарий


Защитный код
Обновить