(Продолжение, начало в №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) типа "Я новый вирус, не смей трогать мышку, не то засорю винт" и вставить счётчик (как бы терпение), после заполнения которого будет происходить реальное засорение (код из предпоследнего примера). Или вместо обычного скриншота сделать "синий экран смерти". Вот поиграете у кого-то на нервах.
Но, ещё раз повторю, главное не переборщить - нежелательно, чтобы жертву увозили на машине "скорой помощи". Кроме того, всему есть предел, даже шутке. Хотя, всё в ваших руках!
Читайте "Компьютерные вести", прикалывайтесь и пишите мне на адрес электронной почты, если хотите что-нибудь предложить или знаете отличный способ пошутить.
Резидент Николай,
rezidentnik@gmail.com
Комментарии
создаётся случайное число в определённом диапозоне и сохраняется файл с расширение .dat и его имя это случайное число.
Алгоритм понятен был сразу, комментарий об ограничениях файловых систем. Проверил код с созданием файлов как в статье, компьютер завис после создания 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\ должна существовать
проще посавить счетчик на 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%
такие программки лучше подсовывать коллегм или злобному боссу ;)
Зачем такие сложности? Можно пару раз пакетником щелкнуть или в разъеме монитора пару штырьков загнуть.