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

Тема в разделе "Delphi", создана пользователем WinHack, 24 ноя 2016.

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

    Когда нажата кнопка приложения (на Панели Задач), приложение восстанавливается в первоначальное состояние.

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

    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;
    Это ВСЕ!!!