Практическое руководство по компьютерным приколам 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
Вадим
Из письма на мой адрес. (Пришлось писать письмо другу:))
Доброго времени суток всем читателям КГ, которые еще не забыли веселые шутки, которые мы чинили над родными и близкими в предыдущих выпусках. После довольно продолжительного перерыва я решил возобновить эту серию статей по программированию в удовольствие. И вот перед вами вновь очередная порция веселых (смотря для кого, конечно) программ на 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
Компьютерная газета. Статья была опубликована в номере 02 за 2005 год в рубрике программирование :: разное