Ввод пароля, когда приложение восстанавливается из панели задач
Когда приложение будет восстановлено (при нажатии на кнопку на панели задач), будет отображено диалоговое окно ввода пароля для доступа к приложению.
Диалоговое окно ввода пароля должно появлятся перед тем, как приложение восстановится из панели задач. Событие 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.
Комментарии