Как
отомстить "врагу" средствами Windows.pas
Делу,
как известно, время, но и потехе опять же
час :). При чем тут модуль Windows? А кому
захочется тащить на "вражеский"
компьютер софтину в 400 КБ, которая только
и может, что спрятать панель задач и иконки?
Правильно, тому, кто не знает свойств консольного
приложения. Но мы-то с вами тянемся к знаниям
;), так что сейчас создадим полноценную
программу, чьи настройки можно будет редактировать,
и она будет весить ровно в 40 раз меньше,
чем описанная выше. Итак, создам консольную
программу [File>New>Other>Console
Application]. Только чур! - шутка будет
безболезненной, а то можно и в нос схлопотать.
Итак, наш исполняемый файл можно будет настраивать.
Логичнее всего это сделать извне, т.е. из
файла с конфигом, чтобы не светиться во
"вражеской" системе MS-DOS'овским
окошком консоли. Поэтому удалите строку
"{$Apptype Console}" и в разделе
Uses оставьте только модуль Windows. Теперь
ненадолго сверните Delphi и с помощью Блокнота
создайте в той же директории, что и наше
приложение, текстовый файл следующего содержания:
0{скрыть Crl+Alt+Del} 1{менять системные
цвета} 0{менять местами кнопки мыши} 1{показывать
сообщение: "Windows must die!"} 1{выключиться
после одного сеанса}
Назовите его, скажем,
"Config.txt". Он состоит из пяти
строк; каждая строка отвечает за "свою"
функцию. 0 - не задействовать данную "опцию"
во время работы программы, 1 - задействовать
(false и true). Справа БЕЗ ПРОБЕЛА помещаются
комментарии, чтобы мы не позабыли, какая
строка за что отвечает. (Здесь показан пример
настроек, где отключение Ctr+Alt+Del и смена
кнопок мыши неактивны, а остальное работает.)
Таким образом, нужно только связаться с
данным файлом, перебрать каждую строку -
с помощью цикла for…to, как вы уже догадались.
Когда вся информация будет принята приложением,
ее придется постоянно держать в памяти с
помощью динамического массива. Я думаю,
вам не нужно объяснять, что есть динамический
массив, но, чтобы освежить свою и вашу память,
напомню. Продекларируйте:
JokeType: Array[1..10] of Boolean;
Здесь содержится
10 значений, 10 различных переменных типа
boolean, способных - вам известно - принимать
только значения false или true. И данный-то
массив помнит это значение персонально для
каждого из своих десяти членов. (Я намеренно
сделал их так много, чтобы побудить вас
добавить в программу новые функции). Указав
в квадратных скобках номер интересующей
нас переменной, мы получаем для нее возвращаемое
значение true/false, соответствующее ей.
Прочее, думаю, понятно из листинга.
program Joke; uses Windows; const SysColorArray:
array [0..13] of Integer = (COLOR_ACTIVEBORDER,
COLOR_ACTIVECAPTION, COLOR_APPWORKSPACE,
COLOR_BACKGROUND, COLOR_BTNFACE, COLOR_BTNTEXT,
COLOR_CAPTIONTEXT, COLOR_INACTIVEBORDER,
COLOR_INFOTEXT, COLOR_MENU, COLOR_MENUTEXT,
COLOR_WINDOW, COLOR_WINDOWFRAME, COLOR_WINDOWTEXT);
ColorArray: array [0..12] of Integer
= (16776960, 0, 16711680, 65535, 16711935,
32768, 8388608, 255, 12632256, 16777215,
15780518, 128, 32896); //Цвета
хранятся в модуле Graphics.pas, //но
мы не будем использовать его, //а запишем
цвета в цифровом виде. var F:
TextFile; //наш файл
с настройками S: ShortString; i:
Smallint; h: hwnd; JokeType: Array[1..10]
of Boolean; //наш
массив function CheckLine(Line:
ShortString): Boolean; var n1,n2:
Smallint; begin //удаляем
из строки комментарии Result:=false; n1:=pos('{',Line); n2:=pos('}',Line); delete(Line,
n1, n2); if Line='1' then result:=true; end;
begin AssignFile(F, 'config.txt');
//соединяемся с файлом Reset(F);
//перемещаемся в начало
файла for i:=1 to 10 do begin
//читаем все строки ReadLn(F,
s); JokeType[i]:=CheckLine(S); end; CloseFile(f);
//отсоединяемся //начинаем
шутить :) Randomize; if JokeType[1]
then //отключаем Ctrl+Alt+Del SystemParametersInfo(SPI_SCREENSAVERRUNNING,
1, 0, 0); //запускаем
бесконечный цикл: while true do
begin Sleep(10000); //ждем
10 секунд //меняем
системные цвета: if JokeType[2]
then SetSysColors(1, SysColorArray[random(13)],
ColorArray[random(12)]); //меняем
кнопки мыши местами if JokeType[3]
then begin SwapMouseButton(true); Sleep(3000); SwapMouseButton(false); end; if
JokeType[4] then MessageBox(h,'Windows must
die!','Error',0); if JokeType[5] then
Halt; //выключаемся end; end.
Вот и всё.
Если что не удалось - пишите.
|