Книга: Delphi. Учимся на примерах

Разработка программного кода

Разработка программного кода

Объявим в качестве закрытых членов класса формы переменную типа HWND и две процедуры, которые разработаем чуть позже:

type
 TForm1 = class(TForm)
 …
private
 { Private declarations }
 h1: HWND; //переменная, содержащая идентификатор окна
 procedure logon(); //блокирует все, пока пароль не будет
  //введен верно
 procedure_check(); //проверка корректности пароля
public
 { Public declarations }
end;

Теперь в разделе implementation создадим сами процедуры. Сначала процедура check:

procedure TForm1.check();
begin
 if pass.Text = 'password' then //если пароль верный
 begin
  //узнаем идентификатор Рабочего стола
  h1:= FindWindow('Progman',nil);
  //разрешаем работу с Рабочим столом
  ShowWindow(h1, sw_show);
  // узнаем идентификатор панели задач
  h1:= FindWindow('Shell_traywnd',nil);
  //разрешаем работу с панелью задач
  ShowWindow(h1, sw_show);
  halt; //закрываем программу
 end // иначе, выводим сообщение о неверном пароле
 else ShowMessage('Wrong password!');
end;

Процедура check проверяет корректность пароля. В данном случае в качестве пароля используется слово "password". Если в поле pass введено именно это слово, то разблокируем Рабочий стол и панель задач. После этого доступ ко всему открыт, и мы завершаем работу программы. Если же введенный пользователем текст не совпадает с корректным паролем, то мы продолжаем требовать ввод пароля.

Теперь очередь процедуры logon:

procedure TForm1.logon();
begin
 //узнаем идентификатор Рабочего стола
 h1:= FindWindow('Progman', nil);
 ShowWindow(h1, sw_hide); //прячем Рабочий стол
 //находим панель задач
 h1:= FindWindow('Shell_traywnd', nil);
 ShowWindow(h1, sw_hide); //прячем панель задач
 {проверяем, не запущен ли диспетчер задач}
 h1:= FindWindow(nil, 'Диспетчер задачWindows');
 {если да, то закрываем окно диспетчера задач}
 if (h1 <> 0) then PostMessage(h1, WM_QUIT, 1, 0);
end;

Здесь мы блокируем Рабочий стол и панель задач, а затем проверяем, не пытается ли пользователь отключить нашу программу с помощью диспетчера задач. Если окно диспетчера задач открыто, то закрываем его.

Теперь нам почти не придется программировать — мы просто будем вызывать процедуры check и logon. При нажатии кнопки Enter вызывается процедура check:

procedure TForm1.Button1Click(Sender: TObject);
begin
 check;
end;

Для того чтобы не утруждать пользователя нажатиями кнопки на форме, имитируем эту операцию по нажатию в поле pass клавиши <Enter>. Для этого создайте обработчик события pass.OnKeyРгеss:

procedure TForm1.passKeyPress(Sender: TObject; var Key:Char);
begin
 if key = #13 then // если нажата клавиша <Enter>
  check; //вызываем процедуру check
end;

#13 —это код клавиши <Enter>.

Коды символов и клавиш клавиатуры перечислены в приложении А.

Для первого таймера событие OnTimer будет содержать только вызов процедуры logon:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 logon;
end;

Для второго таймера (у которого свойство Interval имеет значение 1000) добавьте в обработчик события OnTimer следующий код:

procedure TForm1.Timer2Timer(Sender: TObject);
begin
 h1:= FindWindow('Progman',nil); //поиск Рабочего стола
 ShowWindow(h1, sw_hide); //прячем Рабочий стол
 CloseWindow(h1); //сворачиваем окно Рабочего стола
 pass.SetFocus; //переводим курсор в текстовое поле
end;

Сворачивание окна Рабочего стола приводит к закрытию системного меню Пуск, если оно открыто. В конечном итоге пользователь не имеет доступа к Рабочему столу, к панели задач, к меню Пуск и диспетчеру задач, однако, несмотря на то, что наша программа не имеет заголовка, ее можно закрыть с помощью комбинации клавиш <Alt+F4>. Для того чтобы отключить эту возможность, создайте обработчик события главной формы OnCloseQuery и добавьте в него следующий код:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 CanClose:= False;
end;

Единственное, что осталось сделать, — обеспечить программе автозагрузку, указав путь к ней в системном реестре. Для работы с реестром необходимо добавить в раздел uses ссылку на модуль Registry, а за тем создать следующий обработчик события формы OnCreate:

procedure TForm1.FormCreate(Sender; TObject);
var
 Reg: TRegistry;//переменная для работы с реестром
begin
 Reg:= TRegistry.Create;
 Reg.RootKey:= HKEY_CURRENT_USER; //только для текущего пользователя
 Reg.OpenKey('SoftwareMicrosoftWindowsCurrentVersionRun', true); //открываем раздел автозагрузки в реестре
  //и записываем название и полный путь к нашей программе
 Reg.WriteString('Logon', Application.ExeName);
 Reg.CloseKey; //закрываем реестр
 Reg.Free; //освобождаем память
end;

Теперь наша программа будет загружаться для текущего пользователя вместе с системой и требовать ввод пароля. Программа в действии показана на рис. 10.2.


Рис. 10.2. Программа Вход в систему в действии

Оглавление книги


Генерация: 0.270. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз