...
...

Практическое руководство по компьютерным приколам 6

Я подшутил над другом, а он обиделся и больше со мной не дружит. Говорит, что я ему мог компьютер испортить. Напишите, пожалуйста, ему письмо, что ваши шутки не могут испортить компьютер. А то он мне не верит. Заранее спасибо.
Вадим
Из письма на мой адрес. (Пришлось писать письмо другу:))


Доброго времени суток всем читателям КГ, которые еще не забыли веселые шутки, которые мы чинили над родными и близкими в предыдущих выпусках. После довольно продолжительного перерыва я решил возобновить эту серию статей по программированию в удовольствие. И вот перед вами вновь очередная порция веселых (смотря для кого, конечно) программ на Delphi, которые нам предстоит написать собственными руками для полноты морального удовлетворения. Начну сразу с небольшой просьбы, которую лучше высказать один раз всем, чем отвечать каждому поодиночке. Несколько огорчает, что во многих письмах суть заказываемых приколов сводится к форматированию винчестера и перепрошивке BIOS'а для того, чтобы "удивить друга". Ребята, Windows и так один большой баг. Зачем вам мучаться? Немного подождите, и она сделает все это за вас:). Ну что ж, лирическое отступление закончено, пора разрушить мнение противника о спокойствии и порядке, царящем на экране его монитора. К бою!

1. Извините, но данная версия Windows не подходит для запуска этого вируса
Итак, начнем, пожалуй, с сильно нашумевших в свое время вирусов типа Sasser и им подобных, которые выбрасывали на экран веселое окошко с сообщением об ошибке в очередной дырке типа "проходной двор" от Microsoft — lsass.exe — и тикающими часиками, любезно информирующими пользователя о том, что на высказывание своего мнения о Windows и Билле Гейтсе лично у него есть всего 60 сек. Именно написанием этой системной перегружалки мы с вами сейчас и займемся. Первый плюс программы заключается в том, что убить это окошко без соответствующих навыков довольно проблематично, второй — в том, что жертва, решившая, что подхватила Sasser, начитавшись умной книги из 600 страниц "Убийство вирусов для чайников", выдернет все сетевые кабели, обложится файрволлами и обрастет антивирусами как елка игрушками под Новый год. Невдомек, бедолаге, что даже самые умные антивирусы пока не научились справляться с полетом мысли истинных ценителей компьютерного юмора и определять степень вредоносности программ на Delphi. Кстати, о птичках… Delphi загружена? Приступаем к операции. Вешаем на формочку таймер с интервалом в 300000 (5 мин.) и, дважды кликнув на форме, пишем в обработчике OnCreate:

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.ShowMainForm:=false;
end;

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

procedure TForm1.Timer1Timer(Sender: TObject);
begin
WinExec('shutdown -f -s -c "Ошибка 245EDF02xFF в модуле lsass.exe." -t 60',sw_show);
end;

Собственно, все. Для того, чтобы убить окошко перезагрузки, достаточно в окошке Пуск — Выполнить прописать команду shutdown -a, затребовав затем компенсацию за спасенную от неминуемой смерти систему. Прикол крайне прост в исполнении, зато весьма действенен в применении.

2. О бедном WinAmp'е замолвите слово
WinAmp слушают все — ну, уж если не все, то точно подавляющее большинство. Так как же получилось, что всенародный плейер остался без нашего теплого внимания? Нужно срочно исправить этот недостаток и доказать всем, что руки у нас длинные, мы легко достанем до... точнее, просто достанем:). Сперва небольшая вводная лекция на тему "Найти и уничтожить". В предыдущих статья я уже рассказывал, что получить управление над любым окном любой программы можно с помощью функции FindWindow(), где искать окно можно было двумя способами:
1. По имени класса.
2. По имени заголовка окна.
Пользовались мы всегда вторым способом, поскольку во всех предыдущих приколах заголовок окна был известен заранее. Однако WinAmp при проигрывании трека добавляет в заголовок своего окна название этого трека, поэтому процесс поиска окна с подобными заголовками приходится несколько усложнять либо использовать первый способ поиска по классу, чем мы сейчас и займемся. К счастью, разработчики этого замечательного плейера подумали о нас, несчастных, и любезно сообщили, что искать нужно класс "Winamp v1.x". Для управления самим проигрывателем мы будем использовать функцию отправки системных сообщений SendMessage(). Общий же алгоритм действия таков:

h:=findwindow('Winamp v1.x', nil); // находим дескриптор окна Winamp'а
sendmessage(h,WM_COMMAND,40045,0); // проигрывает трек (Play)
sendmessage(h,WM_COMMAND,40047,0); // останавливает трек (Stop)
sendmessage(h,WM_COMMAND,40044,0); // предыдущий трек (Previous track)
sendmessage(h,WM_COMMAND,40048,0); // следующий трек (Next track)
sendmessage(h,WM_COMMAND,40046,0); // пауза (Pause)
sendmessage(h,WM_COMMAND,40058,0); // повышает громкость на 1%
sendmessage(h,WM_COMMAND,40059,0); // понижает громкость на 1%
sendmessage(h,WM_COMMAND,40001,0); // закрывает Winamp

Вот основные сообщения, которые могут нам понадобиться для управления Winamp'ом из программы на Delphi. Ниже приведен алгоритм самой работы в виде кода обработчика таймера, выставленного на 500 мсек.:

procedure TForm1.Timer1Timer(Sender: TObject);
var h:HWND;
begin
h:=findwindow('Winamp v1.x', nil);
if h<> 0 then begin
sendmessage(h,WM_COMMAND,40059,0);
end;
end;

При запуске подобной программы прямо на глазах при проигрывании ползунок громкости ползет влево, уменьшая громкость композиции. Ниже приводится полный список команд, взятый с сайта производителя:
   Previous track button   40044
   Next track button   40048
   Play button   40045
   Pause/Unpause button   40046
   Stop button   40047
   Fadeout and stop   40147
   Stop after current track   40157
   Fast-forward 5 seconds   40148
   Fast-rewind 5 seconds   40144
   Start of playlist   40154
   Go to end of playlist   40158
   Open file dialog   40029
   Open URL dialog   40155
   Open file info box   40188
   Set time display mode to elapsed   40037
   Set time display mode to remaining   40038
   Toggle preferences screen   40012
   Open visualization options   40190
   Open visualization plug-in options   40191
   Execute current visualization plug-in   40192
   Toggle about box   40041
   Toggle title Autoscrolling   40189
   Toggle always on top   40019
   Toggle Windowshade   40064
   Toggle Playlist Windowshade   40266
   Toggle doublesize mode   40165
   Toggle EQ   40036
   Toggle playlist editor   40040
   Toggle main window visible   40258
   Toggle minibrowser   40298
   Toggle easymove   40186
   Raise volume by 1%   40058
   Lower volume by 1%   40059
   Toggle repeat   40022
   Toggle shuffle   40023
   Open jump to time dialog   40193
   Open jump to file dialog   40194
   Open skin selector   40219
   Configure current visualization plug-in   40221
   Reload the current skin   40291
   Close Winamp   40001
   Moves back 10 tracks in playlist   40197
   Show the edit bookmarks   40320
   Adds current track as a bookmark   40321
   Play audio CD   40323
   Load a preset from EQ   40253
   Save a preset to EQF   40254
   Opens load presets dialog   40172
   Opens auto-load presets dialog   40173
   Load default preset   40174
   Opens save preset dialog   40175
   Opens auto-load save preset   40176
   Opens delete preset dialog   40178
   Opens delete an auto load preset dialog   40180

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

3. Услышь меня
До сих пор мы организовывали диалог компьютера с пользователем посредством выскакивающих окон, печатающегося на глазах текста в блокноте, надписей на рабочем столе и т.д. Пришло время сделать шаг на очередную ступеньку и научить компьютер разговаривать со своей жертвой. Многие из нас, возможно, уже сталкивались с программами, произносящими текст голосом, доносящимся из колонок. Конечно, фразу "Я хочу тебя" голосом Памелы Андерсен мы получить не сможем (а жаль:)), поэтому придется довольствоваться встроенными средствами Windows — точнее, пакетом Microsoft Speech API. В Windows XP он уже поставляется по умолчанию, поэтому счастливым обладателям этой ОС даже делать особо ничего не придется, если у них не beta-версия (попадались и такие). Всем остальным для реализации этого прикола нужно скачать с адреса http://www.microsoft.com/speech/ пакет Microsoft SAPI for Windows 5.1. Весит он неслабо (около 70 Мб), поэтому подумайте заранее о целесообразности этого счастья ради маленькой шутки. Теперь придется поколдовать и с самой Delphi, поскольку "Без пруда не вытащишь и рыбку из него":). Создаем новый проект, затем выбираем меню Project — Import Type Library. В списке отыскиваем Microsoft Speech Object Library 5.0 или 5.1 (подойдут оба варианта), затем в поле Palette Page вводим что-нибудь вроде "MySpeechAPI" (ActiveX, который стоит по умолчанию, можно в принципе было и не трогать, но если мы зададим свое имя, то в палитре компонентов появится новая вкладка со всеми SAPI-компонентами, которые нам нужны). Жмем Install, затем в появившемся окошке жмем OK. Ждем сообщения об удачной установке 19 компонентов SAPI. Закрываем результаты установки нового типа и готовимся непосредственно к разговору. После всего вышеприведенного у нас на панели компонентов должна появиться вкладка MySpeechAPI с кучей однотипных элементов. Отыскиваем тот, который называется SpVoice, и вешаем его на форму. Для извлечения звука достаточно всего одной строчки:

SpVoice1.Speak('hello! my name if bill gates, SVSFDefault);

Или в варианте для таймера:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
SpVoice1.Speak('hello! my name if bill gates, SVSFDefault);
end;

К сожалению, по-русски говорить наша программа не умеет, но это можно немного подправить, используя английские буквы для написания русских слов (privet, saam duruak и т.д.). Вот теперь можно в полной мере позаговаривать зубы кому угодно.
Раз уж мы коснулись темы Multimedia, придется описать еще один простой способ проиграть в программе WAV-файл без использования громоздкого компонента Delphi Mediaplayer. Для этого достаточно просто добавить в список модулей вашего приложения модуль MMSystem и написать по тому же таймеру:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
sndPlaySound('tada.WAV', SND_ASYNC);
end;

Вместо tada.wav следует подставить путь к нужному файлу. Запускаем, наслаждаемся.

4. Мне мышка и друг, и товарищ...
О мышке я уже писал. Но эта тема, наверное, будет актуальной до тех пор, пока этим нехитрым устройством пользуются люди, а значит, эта всегда и везде. Первая "недокументированная возможность Windows", которую я хочу предложить вашему вниманию, называется ограничение зоны действия мышки. Т.е. мы явно зададим область, за пределы которой наша мышка ни ногой. Для тестирования зададим область, которая не доходит на 30 пикселей до конца, т.е. мышка не сможет попасть на кнопку Пуск и панель задач. Ставим интервал таймера в 100 мсек. и в его обработчике пишем:

procedure TForm1.Timer1Timer(Sender: TObject);
var
r: TRect;
pr: PRect;
begin
r.Left := 0;
r.Top := 0;
r.Right := Screen.Width ;
r.Bottom := Screen.Height — 30;
pr := @r;
ClipCursor(pr);
end;

Процедура ClipCursor как раз таки и задает область перемещения мышки. В качестве параметра в нее передается запись, поля которой мы заполняем предварительно. Screen.Width и Screen.Height возвращают нам размеры текущего экрана по горизонтали и вертикали соответственно. Для задания перемещения мышки только по горизонтали, например, код должен выглядеть следующим образом:

procedure TForm1.Timer1Timer(Sender: TObject);
var
r: TRect;
pr: PRect;
begin
r.Left := 0;
r.Top := Screen.Height div 2;
r.Right := Screen.Width;
r.Bottom := Screen.Height div 2;
pr := @r;
ClipCursor(pr);
end;

Однако на этом наши издевательства над мышкой не заканчиваются. Ниже приведены некоторые "мышиные процедуры", которые позволят вам в полной мере использовать полет фантазии для достижения максимального эффекта:

showcursor(false); //скрывает курсор мышки
showcursor(true); //показывает курсор мышки
swapmousebutton(true) //меняет местами функции левой и правой кнопок мыши
swapmousebutton(false) //возвращает все обратно
SetCursorPos(x, y); //перемещает мышку в указанные координаты
SetCaretBlinkTime(2000); //установка времени мерцания курсора в мсек.

Отдельно следует упомянуть о программной симуляции нажатия мышки, которая выглядит следующим образом:
1. Симуляция нажатия левой кнопки мыши:
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
2. Симуляция нажатия правой кнопки мыши:
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
3. Симуляция двойного щелчка левой кнопкой мышки:
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
GetDoubleClickTime;
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

С мышкой вроде покончили. С бедным пользователем, на которого все это свалится, еще нет. Двигаемся дальше.

5. Инвертирование
Вирусы пописали, с WinAMP'ом поигрались, поговорили по душам со своим железным другом, мышкой поуправляли, а про экран совсем забыли. Непорядок, скажете вы и будете абсолютно правы. Наш следующий эффект сделает совершенно простую вещь — инвертирует текущее состояние экрана. Несмотря на кажущуюся простоту и бесполезность этого трюка, все негативное мнение о нем пропадает сразу же после взгляда на экран после его работы. А уж посмотреть там, поверьте, есть на что. В обработчике таймера пишем:

procedure TForm1. Timer1Timer(Sender: TObject);
var
dc:Hdc;
begin
dc:=GetDc(0);
PatBlt(dc, 0, 0, screen.Width, screen.Height, DSTINVERT   );
end;

Результат этого кода превосходит все ожидания. Не верите, убедитесь сами.

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

Паша Либер aka Fireangel, Fireangel@tut.by

© Компьютерная газета

полезные ссылки
IP камеры видеонаблюдения