Глава 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 клавіші
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; // переводимо курсор в текстове поле
Згортання вікна Робочого столу призводить до закриття системного меню Пуск, якщо воно відкрито. В кінцевому підсумку користувач не має доступу до Робочого столу, до панелі завдань, до меню Пуск і диспетчеру завдань, проте, незважаючи на те, що наша програма не має заголовка, її можна закрити за допомогою комбінації клавіш
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);