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

Отображение окна ввода пароля при восстановлении приложения

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;

Обработка SC_RESTORE WM_SYSCOMMAND с использованием HookMainWindow

Сначала в OnCreate MainForm установим ловушку :)

Сразу убедитесь, что Вы сняли ловушку, когда форма будет разрушена.

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


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('Вы Админ?', mtWarning, mbYesNo, 0) = mrNo;
end;

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

Это ВСЕ!!!


 

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


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