Мова delphi досить потужний мову програмування. З його допомогою можна створювати додатки різної складності. Починаючи від найпростіших текстових редакторів закінчуючи складними 3d-іграми. Але зараз мова піде не зовсім про це, спробуємо розглянути різні можливості delphi. У цій статті ми поглянемо на декілька різних прикладів, які не можна віднести до жодної з окремих тем програмування. Однак, від цього вони не стануть гірше або краще, а просто розглянемо теми, на які досить рідко пишуть статті. Можливі ви навіть отримаєте більше корисної інформації, ніж при прочитанні статті на конкретну тему.

І назвемо цю статтю Жарти в delphi, прочитавши її ви зможете не тільки пожартувати за допомогою комп’ютера над ким завгодно, але, сподіваюся дізнаєтеся і нове по роботі з операційною системою windows. Адже. для того що б написати хорошу жарт треба не тільки володіти хорошою фантазією, але і представляти як це реалізувати програмно. Ось зараз я покажу декілька прикладів жартів, які зможуть підштовхнути вас на написання своїх жартівливих програм.

Ну що ж, від слів перейдемо до справи.

Жарти за допомогою системного реєстру.

Мабуть, жарти з цього розділу будуть найбільш легко здійсненними. Тут не треба володіти якимись складними техніками програмування, досить просто вміти поводитися з реєстром з delphi.Та й навіть якщо ви не вмієте це робити, то швидше за все зрозумієте, тим більше перший приклад докладно описаний. Однак, відразу ж хочу попередити якщо у користувача, над яким хочете пожартувати немає адміністраторських прав, то нічого не вийде тому що windows xp і інші з сімейства nt дозволяють редагувати реєстр тільки користувачам
з найвищими правами.

І першою жартом яку ми розглянемо буде приклад, який я назвав Не вимикайте Вінда”.

«Не вимикати Вінда»

В реєстрі windows можна редагувати практично всі налаштування системи, однак часто ці параметри ніде не офишируються і не доступні для широкої публіки.

Отже, для того що позбавити кращого друга або подругу можливості вимкнути улюблений windows достатньо додати лише одну або дві запису запису (на ваш розсуд) до реєстру за адресою hkey_current_usersoftwaremicrosoftwindowscurrentversionpoliciesexplorer. Якщо додати туди параметр noclose дорівнює одиниці, то користувач позбутися можливості вимкнути комп’ютер, а запис nologoff (тожеравная 1) не дасть користувачу змінити профіль, однак останній параметр не працює в xp.

І так подивимося як же це зробити за допомогою delphi. Як я вже говорив, глибокі знання вам не знадобляться, але для тих хто зустрівся з роботою з реєстром перший рас все ж розповім як це працює. Але для початку наведу код, що б було легше розбирати.

Лістинг 1. «Не вимикати Вінда»
procedure tform1.nocloseclick(sender: tobject);
var
reg: tregistry;
begin
reg:=treginifile.create();
reg.rootkey:=hkey_current_user;
reg.openkey(‘softwaremicrosoftwindowscurrentversionpoliciesexplorer’, true);
reg.writeinteger(‘noclose’, 1);
reg.writeinteger(‘nologoff’, 1);
reg.free;
end;

Для того що б код запрацював нормально нам знадобитися в розділі uses додати модуль registry і поставити на форму всього одну кнопку (я назвав її noclose). Після чого створити обробник події onclick для кнопки і написати туди наведений вище код.

Спочатку ми оголошуємо змінну reg типу tregistry саме її ми буде використовувати для доступу до реєстру. Далі ми її ініціалізуємо. Це означає, що ми виділяємо пам’ять під об’єкт. Наступним рядком ми меняемключевую гілку регістра на hkey_current_user; за умовчанням параметр rootkey дорівнює hkey_local_machine. Далі слід ділянку коду:

Лістинг 2.
reg.openkey(‘softwaremicrosoftwindowscurrentversionpoliciesexplorer’,
true);
reg.writeinteger(‘noclose’, 1);
reg.writeinteger(‘nologoff’, 1);

Тут ми відкриваємо ключ ‘softwaremicrosoftwindowscurrentversionpoliciesexplorer’ і якщо такий ключ ще не створено в реєстрі, що малоймовірно, то створюємо його. І після чого додаємо дві запису noclose і nologoff, про які вже говорилося вище.

Останній рядок коду звільняє пам’ять, виділену під змінну reg. Хоча компілятор і сам повинен звільняти пам’ять використовується для локальних змінних, але краще перестрахуватися і зробити це самому, ніж в підсумку одержати постійно зависає додаток.

Відключаємо alt+ctrl+del.

Для того що б бути впевненим у тому, що користувач не відключити вашу жартівливу програму за допомогою клавіш alt+ctrl+del. необхідно добре заховати додаток або… відключити диспетчер завдань. Тим більше, що відключити його набагато простіше, ніж повністю сховатися від «всевидящей» програми і робиться це ні трохи не складніше, ніж у минулому прикладі.

За активність taskmanager’a відповідає параметр disabletaskmgr, який знаходитися в ключі hkey_current_usersoftwaremicrosoftwindowscurrentversionpoliciessystem. Якщо він дорівнює одиниці, то замість Диспетчера завдань, при натисканні alt+ctrl+del побачать повідомлення про те, що «Всемогутня утиліта» відключена їх адміністратором.

А тепер покажу як реалізувати це на delphi, хоча ви напевно і самі здогадалися:

Лістинг 3. Відключаємо alt+ctrl+del.
procedure tform1.disablealtctrldelclick(sender: tobject);
var
reg: tregistry;
begin
reg:=treginifile.create();
reg.rootkey:=hkey_current_user;
reg.openkey(‘softwaremicrosoftwindowscurrentversionpoliciessystem’, true);
reg.writeinteger(‘disabletaskmgr’, 1);
reg.free;
end;

Працює цей код точно також як і в предедушем випадку.

Зараз ми розглянули два види заборон, однак їх дещо більше. Список того, що відомо мені перерахований нижче.

hkey_current_usersoftwaremicrosoftwindowscurrent versionpoliciesexplorer

Меню «Пуск»

norecentdocsmenu — Приховати «Документи»
nofavoritesmenu — Приховати «Вибране»
nofind Приховати — «?айти»
nohelp Приховати — «Довідка»
norun Приховати — «Виконати»
noclose Приховати — «Завершення роботи»
nologoff Приховати — «Завершення сеансу»
nowindowsupdate — приховати «windows update»
nostartmenusubfolders — приховати підкаталоги
nosetfolders — приховати «?астройка»
nocommongroups — приховати «Програми»
nochangestartmenu — заборонити контекстне меню в меню «Пуск»
notraycontextmeny — заборонити контекстне меню панелі завдань
nosettaskbar — заборонити настройку Панелі задач

Меню «Пуск», підменю «?астройка»

nosetactivedesktop — Приховати Робочий стіл active desktop
nosetfolders — приховати «Принтери» і «Панель керування»
nosettaskbar — приховати Панель завдань і меню «Пуск»
nonetworkconnections — приховати «Віддалений доступ до мережі»

Меню «Пуск», підменю «Документи»

norecentdocshistory — не пам’ятати нещодавно відкритих документів
maxrecentdocs — нещодавно відкритих документів
clearrecentdocsonexit — Очистити список недавно відкритих документів при виході
nosmdocs — приховати «Мої документи»
nosmmypictures — приховати «Мої малюнки»

Меню «Пуск», підменю «?астройка», пункт «Принтери»

noprintertabs — приховати деякі вкладки в діалозі «Властивості»: принтер
nodeleteprinter — заборонити видалення принтера.
noaddprinter — заборонити додавання принтера.

Робочий стіл

nodesktop — Відключити Робочий стіл
classicshell — Зробити вигляд схожим на win 95
nointerneticon — Приховати значок «Інтернет»
nonethood — Приховати «Мережеве Оточення»
nostartbanner — Вимкнути «?ачните роботу з натискання цієї кнопки»
noactivedesktop — Відключити active desktop
noactivedesktopchanges — Заборонити зміни на active desktop

Різне

nosavesettings Заборонити збереження установок
nodrives Приховати всі диски в Мій комп’ютер (ff ff ff ff). В залежності від
значення ховаються різні літери
дисків, 00 00 00 00 — не прихований ні один.

Панель управління, діалог Мережа
hkey_current_usersoftwaremicrosoftwindowscurrentversionpoliciesnetwork

nonetsetup — Діалог Мережа недоступний.
nonesetupidpage — Вкладка Ідентифікація недоступна.
nonetsetupsecuritypage — Вкладка Управління доступом недоступна.

noentirenetwork — Приховати Вся мережа
noworkgroupscontents — Приховати вміст мережі

Панель управління, діалог Паролі
hkey_current_usersoftwaremicrosoftwindowscurrentversionpoliciessystem

noseccpl — Діалог Паролі недоступний.
nopwdpage — Вкладка Зміна паролів недоступна.
noadminpage — Вкладка Стир е адміністрування недоступна.
noprofilpage — Вкладка Профілі користувачів недоступна.

Панель управління, діалог Система

nodevmgrpage Вкладка Пристрою недоступна.
noconfigpage Вкладка Профілі обладнання недоступна.
nofilesyspage Кнопка Файлова система на вкладці Швидкодію
недоступна.
novirtpage Кнопка Віртуальна пам’ять на вкладці Швидкодію недоступна.

Панель управління, діалог Екран

nodispcpl — Діалог Екран недоступний
nodispappearancepage — Вкладка Оформлення недоступна
nodispbackgroundpage — Вкладка Фон недоступна
nodispscrsavepage — Вкладка Заставка недоступна
nodispsettingspage — Вкладка ?астройка недоступна

З цього списку ви можете вибрати хоч всі і ваш друг або ворог буде сидіти за ОС, в якій практично нічого не можна робити.

windows який хоче чогось видалити.

Напевно, кожен користувач windows бачив і користувався атлетом Установка і видалення програм”, але далеко не кожен задумувався звідки ці дані беруться. Дак, ось вони теж охоронятися в реєстрі ключеhkey_local_machinesoftwaremicrosoftwindowscurrentversionuninstall. У цьому ключі розташовуються дочірні вузли у яких знаходяться дані про встановлені програми. В тому числі і шлях до дейнсталятору програми. Зараз я покажу як отримати ці дані, а потім від імені windows запропонувати користувачеві видалити якусь програмку.

Як зазвичай спочатку код, а потім його пояснення:

Лістинг 4. windows який хоче чогось видалити.
procedure tform1.deleteahyprogclick(sender: tobject);
var
i: integer;
buf: array[0..1000] of char;
keyhandle: hkey;
begin
timer1.enabled:=true;
keys:=tstringlist.create;
if regopenkey(hkey_local_machine,
‘softwaremicrosoftwindowscurrentversionuninstall’,
keyhandle)=error_success then begin
i:=0;
while regenumkey(keyhandle, i, buf, sizeof(buf))=error_success do begin
keys.add(strpas(buf));
i:=i+1;
end;
end;
end;

Тут я вирішив трохи урізноманітнити наше життя і використовував методи winapi, вони не набагато складніше, зате працювати з ними набагато цікавіше. Але попередньо я оголосив глобальну змінну keys типу tstringlist і ініціалізувати її на самому початку і локальну змінну keyhandle типу hkey, де буде зберігатися вказівник на відкритий ключ реєстру.

Перша winapi функція, яку будемо викликати є regopenkey, в неї треба передати три параметра:
1)Гілка регістра, в якій будемо відкривати потрібний нам ключ, передаємо туди
hkey_local_machine;
2)Ключ який будемо відкривати
3)Покажчик на відкритий ключ

Функція поверне error_success, якщо ключ відкритий успішно. Досить дивно, що константу назвали таким чином, спочатку це мене бентежило, але потім швидко звик. Далі запускаємо цикл поки є не оброблені елементи у відкритому ключі. Для цього використовуємо функцію regenumkey і знову повертається результат порівнюємо з error_success, як тільки переберемо всі дочірні ключі функція поверне інше значення і цикл зупинитися.

Сама функція має чотири параметри:
1)Покажчик на відкритий ключ. Його ми отримали при використанні функції regopenkey і перебувати він змінної keyhandle
2)Номер дочірнього ключа
3)Змінна куди буде записано назва дочірнього ключа
4)Розмір змінної buf, куди запишемо результат

Решта має бути зрозуміло тому переходжу до подальшого опису.

Ще поставив на форму один таймер за яким буде відбуватися виклик програми видалення, властивості time присвоїв 120000мс або 2 хвилини і для події ontimer написав наступний код:

Лістинг 5. windows який хоче чогось видалити.
var
reg: tregistry;
key: &string;
index: integer;
begin
randomize;
reg:=treginifile.create();
reg.rootkey:=hkey_local_machine;
index:=random(keys.count+1);
reg.openkey(‘softwaremicrosoftwindowscurrentversionuninstall’+keys[index],
true);
key:=reg.readstring(‘uninstallstring’);
if key”then begin
messagebox(0, ‘do you want to delete any programm?’, ‘ms windows’,
mb_ok+mb_iconquestion);
shellexecute(0, ‘open’, pchar(key), “, “, sw_shownormal);
end;

Почнемо її Розгляд із змінною index, де зберігатися випадкове число у проміжку від 0 до keys.count, з його допомогою ми будемо отримувати повний шлях до будь-якого з безлічі доступних нам ключів. Потім у відкритому ключі читаємо параметр uninstallstring і записуємо результат в key. Тепер там повинен бути шлях до деинсталятору, залишилося тільки запустити його, але якщо якийсь недосвідчений програміст не вказав цей параметр, то він буде дорівнює пустому рядку і тому необхідно змінну key, що ми і зробили.

Міняємо заголовки стандартних програм windows.

Подібну жарт зазвичай реалізують з допомогою операцій дескриптор вікна, однак можна це зробити з реєстру. В інтернеті мені жодного разу не попадався на очі другий варіант, можливо із-за його обмеженої функціональності. Справа в тому, що так можна поміняти заголовок тільки у деяких стандартних програм windows.

Розглянемо приклад з усіма відомої програми windows media player. Для цього треба відкрити ключ hkey_current_usersoftwarepoliciesmicrosoft і створити в ньому дочірній ключ windowsmediaplayer, після чого в ньому створити текстовий параметр titlebar і в нього записати все, що вам хочеться. Для прикладу, я вніс туди адресу свого сайту і запустивши програму заголовок програвача був наступний: windows media player provided by noil.pri.ee”.

Хоч це і важко, але реалізацію всього вищесказаного все-таки наведу.

Лістинг 6. Міняємо заголовки стандартних програм windows.
procedure tform1.changewmpcaptionclick(sender: tobject);
var
reg: tregistry;
begin
reg:=treginifile.create();
reg.rootkey:=hkey_current_user;
reg.openkey(‘softwarepoliciesmicrosoftwindowsmediaplayer’, true);
reg.writestring(‘titlebar’, wmpcaption.text);
reg.free;
end;

Жарти з мишкою.

Некерована миша.

Улюблене зайняти практично кожного сучасного користувача комп’ютера водити по екрану вказівник миші, щелкав там і тут. Але що він буде робити, якщо миша сама буде стрибати по екрану, при цьому змінюючи вигляд свого покажчика. Ось зараз ми навчимося це робити всього три рядки коду.

Лістинг 7. Некерована миша.
procedure tform1.timer2timer(sender: tobject);
const
cursors: array[0..15] of integer=(ocr_normal, ocr_ibeam, ocr_wait, ocr_cross,
ocr_up, ocr_size, ocr_icon,ocr_sizenwse, ocr_sizenesw,
ocr_sizewe, ocr_sizens, ocr_sizeall, ocr_icocur, ocr_no,
ocr_hand, ocr_appstarting);
begin
randomize;
setsystemcursor(getcursor,cursors[random(high(cursors)+1)]);
setcursorpos(random(screen.width), random(screen.height));
end;

На самому початку оголошений масив покажчиків на всі системні курсори для windows. Сам код написаний для події ontimer таймера і тому буде виконуватися періодично. Всю смислове навантаження несуть дві прості функції: setsystemcursor змінює один курсор на інший. Другий курсор ми випадково вибираємо з раніше створеного масиву, a setcursorpos визначає нової положень курсору.

Падаюча миша.

Мені завжди більше подобалося знайти яку-небудь залежність і змусити вказівник не просто рухатися хаотично, а викреслювати на екрані красиві” лінії. Ось зараз хочу показати, як можна створити ефект того, що миша падає з висоти екрану з прискоренням. В самому прикладі нічого нового немає, просто хочеться показати як написати цікаву жарт, ніж безладне стрибання мишки по екрану.

Лістинг 8. Падаюча миша.
procedure tform1.downmouseclick(sender: tobject);
var
mpos: tpoint;
index: double;
h: hwnd;
begin
b:=true;
h:=createevent(nil, true, false, ‘ut’);
index:=1;
while b do begin
getcursorpos(mpos);
if mpos.y>=screen.height-20 then begin
waitforsingleobject(h, 5000);
index:=1;
getcursorpos(mpos);
end;
index:=index+index/30;
mpos.y:=mpos.y+round(index);
setcursorpos(mpos.x, mpos.y);
application.processmessages;
waitforsingleobject(h, 10);
end;
end;

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

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

Жарти з монітором.

Пишемо прямо на моніторі.

Є два способи намалювати або написати на моніторі, це перший використовувати функції winapi або зв’язати вказівник на полотно” монітор з об’єктом tcanvas. І те й інше досить просто. Розглянемо тепер більш детально другий спосіб.

Лістинг 9. Пишемо прямо на моніторі.
procedure tform1.button1click(sender: tobject);
var
scr: tcanvas;
begin
scr:=tcanvas.create;
with scr do begin
handle:=getdc(0);
brush.color:=clblue;
font.color:=clred;
font.size:=16;
textout(round(screen.width/2)-round(textwidth(dplcaption.text)/2),
round(screen.height/2)-round(textheight(dplcaption.text)/2),
dplcaption.text);
free;
end;
end;

Найцікавіше в цій процедурі — це функція getdc, яка може повернути контент малювання будь-якого вікна. Якщо ми передамо до неї 0, то отримаємо результатом як раз і буде контент монітора. Тепер залишаються присвоїти отримане значення властивості handle у створеного об’єкта типу tcanvas. Будь примітив намальований на неї буде миттєво відображатися на моніторі поверх всіх вікон.

У наведеному прикладі, по середині екрана виводиться напис з компонента типу tedit, розташованого на формі. У мене він носить назву dplcaption.

Для того що б краще зрозуміти і закріпити запропонований матеріал ви можете розглянути ще один приклад по роботі з екраном; він виводить на екран великий (800*800 пікселів) дорожній знак stop.

Висновок.

Ми розглянули кілька можливостей того, як можна весело подшутит над ким-небудь, але сподіваюся ви дізналися ще й щось нове по роботі з операційною системою windows. Можливо у вас дозріли свої варіанти жартів, але ви точно не уявляєте як їх реалізувати, ви можете залишити повідомлення на подумаємо разом. При бажанні ви зможете побачити реалізацію ваших ідей на сторінці розсилки.