Глава 10 вхід в систему

Результат оформлення форми повинен відповідати рис. 10.1.

Мал. 10.1. Форма для програми входу в систему

Оголосимо як закритих членів класу форми змінну типу HWND і дві процедури, які розробимо трохи пізніше:

h1: HWND; // змінна, що містить ідентифікатор вікна

procedure logon (); // блокує всі, поки пароль НЕ буде

procedure_check (); // перевірка коректності пароля

Тепер в розділі implementation створимо самі процедури. Спочатку процедура check:

if pass.Text = 'password' then // якщо пароль вірний

// дізнаємося ідентифікатор Робочого столу

// дозволяємо роботу з Робочим столом

// дізнаємося ідентифікатор панелі задач

// дозволяємо роботу з панеллю задач

halt; // закриваємо програму

end // інакше, виводимо повідомлення про невірний пароль

else ShowMessage ( 'Wrong password!');

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

Тепер черга процедури logon:

// дізнаємося ідентифікатор Робочого столу

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

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

Тепер нам майже не доведеться програмувати - ми просто будемо викликати процедури check і logon. При натисканні кнопки Enter викликається процедура check:

procedure TForm1.Button1Click (Sender: TObject);

Для того щоб не обтяжувати користувача натисканнями кнопки на формі, імітуємо цю операцію після натискання в поле pass клавіші . Для цього створіть обробник події pass.OnKeyРгеss:

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

if key = # 13 then // якщо натиснута клавіша

check; // викликаємо процедуру check

# 13 -це код клавіші .

Коди символів і клавіш клавіатури перераховані в додатку А.

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

procedure TForm1.Timer1Timer (Sender: TObject);

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

procedure TForm1.Timer2Timer (Sender: TObject);

h1: = FindWindow ( 'Progman', nil); // пошук Робочого столу

ShowWindow (h1, sw_hide); // ховаємо Робочий стіл

CloseWindow (h1); // звертаємо вікно Робочого столу

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

Згортання вікна Робочого столу призводить до закриття системного меню Пуск, якщо воно відкрито. В кінцевому підсумку користувач не має доступу до Робочого столу, до панелі завдань, до меню Пуск і диспетчеру завдань, проте, незважаючи на те, що наша програма не має заголовка, її можна закрити за допомогою комбінації клавіш . Для того щоб відключити цю можливість, створіть обробник події головної форми OnCloseQuery і додайте в нього наступний код:

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

Єдине, що залишилося зробити, - забезпечити програмі автозагрузку, вказавши шлях до неї в системному реєстрі. Для роботи з реєстром необхідно додати в розділ uses посилання на модуль Registry, а за тим створити наступний оброблювач події форми OnCreate:

procedure TForm1.FormCreate (Sender; TObject);

Reg: TRegistry; // змінна для роботи з реєстром

Reg.RootKey: = HKEY_CURRENT_USER; // тільки для поточного користувача

Reg .OpenKey ( 'Software \ Microsoft \ Windows \ CurrentVersion \ Run', true); // відкриваємо розділ автозавантаження в реєстрі

// і записуємо назву і повний шлях до нашої програми

Reg.CloseKey; // закриваємо реєстр

Reg.Free; // звільняємо пам'ять

Тепер наша програма буде завантажуватися для поточного користувача разом з системою і вимагати введення пароля. Програма в дії показана на рис. 10.2.

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

type TForm1 = class (TForm)

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

h1: HWND; // змінна, що містить ідентифікатор вікна

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

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

if pass.Text = 'password' then // якщо пароль вірний

// дізнаємося ідентифікатор Робочого столу

// дозволяємо роботу з Робочим столом

// дізнаємося ідентифікатор панелі задач

// дозволяємо роботу з панеллю задач

halt; // закриваємо програму

end // інакше, виводимо повідомлення про невірний пароль

else ShowMessage ( 'Wrong password!');

// дізнаємося ідентифікатор Робочого столу

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

procedure TForm1.Timer1Timer (Sender: TObject);