Delphi. Учимся на примерах - [18]

Шрифт
Интервал

Для первого таймера событие 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;

Сворачивание окна Рабочего стола приводит к закрытию системного меню Пуск, если оно открыто. В конечном итоге пользователь не имеет доступа к Рабочему столу, к панели задач, к меню Пуск и диспетчеру задач, однако, несмотря на то, что наша программа не имеет заголовка, ее можно закрыть с помощью комбинации клавиш . Для того чтобы отключить эту возможность, создайте обработчик события главной формы 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('Software\Microsoft\Windows\CurrentVersion\Run', true); //открываем раздел автозагрузки в реестре

>  //и записываем название и полный путь к нашей программе

> Reg.WriteString('Logon', Application.ExeName);

> Reg.CloseKey; //закрываем реестр

> Reg.Free; //освобождаем память

>end;

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

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

Полный исходный код модуля

Полный исходный код модуля программы Вход в систему представлен в листинге 10.1.

Листинг 10.1. Модуль программы Вход в систему

>unit Unit1;


>interface


>uses

> Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Registry;


>type TForm1 = class(TForm)

> pass: TEdit;

> Label1: TLabel;

> Timer1: TTimer;

> Button1: TButton;

> Timer2: TTimer;

> procedure Button1Click(Sender: TObject);

> procedure passKeyPress(Sender: TObject; var Key: Char);

> procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

> procedure FormCreate(Sender: TObject);

> procedure Timer1Timer(Sender: TObject);

> procedure Timer2Timer(Sender: TObject);

>private

> { Private declarations }

> h1: HWND; //переменная, содержащая идентификатор окна

> procedure logon(); //блокирует все, пока пароль не будет введен верно

> procedure check(); //проверка корректности пароля

>public

> { Public declarations }

>end;


>var

> Form1: TForm1;


>implementation

>{$R *.dfm}


>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;


>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;


>procedure TForm1.Timer1Timer(Sender: TObject);

>begin

> logon;

>end;


>procedure TForm1.Button1Click(Sender: TObject);

>begin

> check;

>end;


>procedure TForm1.passKeyPress(Sender: TObject; var Key:Char);

>begin

> if key = #13 then // если нажата клавиша

>  check; //вызываем процедуру check

>end;


>procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

>begin

> CanClose:= False;

>end;


>procedure TForm1.FormCreate(Sender; TObject);

>var

> Reg: TRegistry;//переменная для работы с реестром

>begin

> Reg:= TRegistry.Create;

> Reg.RootKey:= HKEY_CURRENT_USER; //только для текущего пользователя

> Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', true); //открываем раздел автозагрузки в реестре

>  //и записываем название и полный путь к нашей программе

> Reg.WriteString('Logon', Application.ExeName);

> Reg.CloseKey; //закрываем реестр

> Reg.Free; //освобождаем память

>end;


>procedure TForm1.Timer2Timer(Sender: TObject);

>begin

> h1:= FindWindow('Progman', nil); //поиск Рабочего стола

> ShowWindow(h1, sw_hide); //прячем Рабочий стол

> CloseWindow(h1); //сворачиваем окно Рабочего стола

> pass.SetFocus; //переводим курсор в текстовое поле


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Геймдизайн. Рецепты успеха лучших компьютерных игр от Super Mario и Doom до Assassin’s Creed и дальше

Что такое ГЕЙМДИЗАЙН? Это не код, графика или звук. Это не создание персонажей или раскрашивание игрового поля. Геймдизайн – это симулятор мечты, набор правил, благодаря которым игра оживает. Как создать игру, которую полюбят, от которой не смогут оторваться? Знаменитый геймдизайнер Тайнан Сильвестр на примере кейсов из самых популярных игр рассказывает как объединить эмоции и впечатления, игровую механику и мотивацию игроков. Познакомитесь с принципами дизайна, которыми пользуются ведущие студии мира! Создайте игровую механику, вызывающую эмоции и обеспечивающую разнообразие.


Обработка событий в С++

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


MFC и OpenGL

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


Симуляция частичной специализации

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.