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; //переводим курсор в текстовое поле


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


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

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


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

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


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

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