![]() |
|
... Здраствуйте. Напишите програму, штоб взламать интернет. А то мне радители там сидеть на дают. Серега Из письма на мой адрес (стиль написания и пунктуация соблюдены) Очередной привет всем любителям компьютерного юмора из разряда "сделай сам" и среды разработки Borland Delphi. Я не зря упоминаю, что разрабатываем мы все приколы, вот уже девятую статью подряд, именно в Delphi, поэтому письма о том, что Visual Basic, C++, Turbo Pascal и текстовый редактор "Блокнот" упорно отказываются компилировать приведенные здесь тексты, безусловно, занятны, но не более того. Письма о том, как было бы весело устроить форматирование винчестера на прикольном низком уровне, начинают уже потихоньку раздражать. Еще пара таких, и все ответы на них будут начинаться глубокими, высокохудожественными, философскими фразами, от которых даже солист группы "Ленинград" стыдливо покраснел бы и отнес свои песни (если их так можно назвать) в разряд "песни для детей". Все больше писем приходит с идеями... иногда даже с толковыми:). Наверное, именно ради таких писем и стоит сейчас отойти от вышеприведенной лирики и углубиться в самые настоящие издевательства над компьютером противника... 1. Оптическая шариковая мышь Мышиная тема никак не хочет исчезать из наших статей. Только-только подумаешь, что писать уже не о чем, как вдруг приходит очередное письмо, и пальцы сами ложатся на клавиатуру. Сейчас мы с вами реализуем до боли знакомую проблему всех обладателей нечищеных шариковых мышек — проскальзывание шарика. К сожалению, в связи с бурным развитием у нас в стране оптических грызунов людей, помнящих об этой проблеме, с каждым днем становится все меньше и меньше. Наша задача исправить это досадное недоразумение. Кто там сказал, что у него уже давно лазерная Logitech MX1000? Сейчас мы программно будем эмулировать в ней шарик, который по законам жанра так же программно и будет проскальзывать:). Для начала запустим Borland Delphi и создадим новый проект. В окне кода добавим небольшой вызов процедуры: procedure BlockInput(ABlockInput: boolean); stdcall; external 'USER32.DLL'; Сама процедура есть, и писать ее не нужно. Вот только находится она в библиотеке 'USER32.DLL', откуда мы благополучно ее извлекаем. Теперь осталось задействовать эту процедуру в нашей программе. Вешаем на форму таймер и выставляем его свойство Interval=500. Затем дважды кликаем по нему и в обработчике пишем следующий код: procedure TForm1.Timer1Timer (Sender: TObject); begin if random(2)=0 then BlockInput(False) else BlockInput(True); end; Процедура BlockInput при передаче ей параметра True наглухо блокирует мышь и клавиатуру, пока не вызвать ее же с параметром False или не нажать Ctrl+Alt+Del (это автоматически разблокирует устройства ввода). Ну, а в обработчике таймера мы решаем, с каким параметром ее вызывать. Осталось только кликнуть дважды по пустому месту на форме или явно вызвать обработчик FormCreate и для сокрытия формы от посторонних глаз записать там: procedure TForm1.FormCreate (Sender: TObject); begin Application.ShowMainForm:=false; end; Приведенный эффект очень даже любопытен при работе. Периодически курсор мышки будет замирать как вкопанный, как будто на самом деле проскальзывает шарик в мышке. Поэтому можно смело приходить со своей масленкой и предлагать скромные услуги по смазке шарика за вполне нескромную оплату. 2. Экипаж Windows прощается с вами Какая досада... в Windows XP есть экран приветствия, а вот на прощание они даже никакой надписи не изволили сделать. Вечно эти мелкомягкие недоглядят, а нам потом исправляй их ошибки. Скоро такими темпами мы с вами принципиально новую операционную систему напишем. Что-нибудь вроде "Belarus Jokes XP". Ладно. Чего уж там. Можно и попрощаться с пользователем при выключении компьютера. Да и кода много писать не придется. Для начала, как всегда, скроем форму от посторонних глаз через обработчик FormCreate: procedure TForm1.FormCreate (Sender: TObject); begin Application.ShowMainForm:=false; end; Теперь поднимемся выше и добавим в класс нашей формы после директивы private процедуру WMEndSession, чтобы класс приобрел следующий вид: type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION; { Private declarations } public { Public declarations } end; Эта процедура будет вызываться, когда к окну придет системное сообщение Windows WM_ENDSESSION, свидетельствующее о том, что система выключается/перегружается, — в общем, завершает работу. Опишем действия внутри процедуры, которую нужно описать в разделе Implementation: {$R *.dfm} procedure TForm1.WMEndSession (var Msg: TWMEndSession); begin if Msg.EndSession = True then messagebox ( 0, 'Экипаж Windows прощается с вами.'+#10+#13+'Помойте уши, почистите зубы и ложитесь спать!', 'Microsoft Windows XP', MB_OK); inherited; end; И каждый раз при выключении своего горячо любимого компьютера пользователь будет получать окошко вышеприведенного содержания: ![]() Ну вот. Мы счастливы, пользователь теряется в догадках от непонятной вежливости собственной операционной системы, а скромные бедные трудяги Microsoft почти оправданы нашим небольшим изменением в функциональности XP. Мелочь, а приятно:). 3. Клавиши Если в вашей жизни преобладают Клава и Аська, то вы не бабник — вы наш человек:). Лечиться от компьютерной зависимости, соответственно, тоже будем вместе. Но только потом... когда начнем стрейфом ходить по улице и судорожно искать "Save" при каждом шорохе в родном подъезде. А пока что лучше будем издеваться над пользовательской клавиатурой, а то что-то я давно уже к ней не возвращался. И начнем мы, пожалуй, с замечательных лампочек на клавиатуре, которые загораются при нажатии на кнопки Num Lock, Caps Lock и Scroll Lock (мы не будем рассматривать мультимедиаклавиатуру, на которой 180 кнопок, 5 скроллов, микрофон, тостер, кофеварка и два десятка разноцветных светодиодов:)). Итак, как ни странно, лампочки могут мигать. Именно этой непреложной истиной мы и воспользуемся для нашего следующего эффекта. Создаем процедуру, которая будет отвечать за зажигание лампочки: procedure SetState(Code: byte; isOn: Boolean); var KBState: TKeyboardState; begin GetKeyboardState(KBState); if (Win32Platform = VER_PLATFORM_WIN32_NT) then begin if Boolean(KBState[Code]) <> isOn then begin keybd_event(Code, MapVirtualKey(Code, 0), KEYEVENTF_EXTENDEDKEY,0); keybd_event(Code, MapVirtualKey(Code, 0), KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); end; end else begin KBState[Code] := Ord(isOn); SetKeyboardState(KBState); end; end; Теперь осталось только повесить на форму таймер, выставить туда интервал в 100 мсек. и написать в его обработчике: procedure TForm1.Timer1Timer (Sender: TObject); begin if random(2)=1 then SetState(VK_NUMLOCK,true) else SetState(VK_NUMLOCK,false); if random(2)=1 then SetState(VK_SCROLL,true) else SetState(VK_SCROLL,false); if random(2)=1 then SetState(VK_CAPITAL,true) else SetState(VK_CAPITAL,false); end; где: VK_NUMLOCK — код клавиши Num Lock VK_SCROLL — код клавиши Scroll Lock VK_CAPITAL — код клавиши Caps Lock После запуска нашей программы лампочки начнут вести себя совершенно диким образом, сбивая с толку офигевающую от такой наглости клавиатуру и всех окружающих ее людей. Для того, чтобы лампочки мигали все одновременно, достаточно изменить обработчик таймера следующим образом: procedure TForm1.Timer1Timer (Sender: TObject); begin if random(2)=1 then begin SetState(VK_NUMLOCK,true); SetState(VK_SCROLL,true); SetState(VK_CAPITAL,true); end else begin SetState(VK_NUMLOCK,false); SetState(VK_SCROLL,false); SetState(VK_CAPITAL,false); end; end; Ну вот. Лампочки весело отбивают что-то, смахивающее на SOS. Все счастливы, идем дальше. Следующая наша шутка будет посвящена всем тем, кто для сохранения образа экрана использует кнопку PrintScreen. Те, кому приходилось перехватывать и обрабатывать нажатия клавиш, могли заметить, что поймать обработчик этой кнопки не так просто, как кажется. Хотя с другой стороны... Пишем в обработчике FormCreate следующий код: procedure TForm1.FormCreate (Sender: TObject); begin Application.ShowMainForm:=false; Application.OnIdle:=AppIdle; End; Теперь осталось создать только саму процедуру Ap-pIdle, в которой и будет происходить отлавливание нашей клавиши: procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean); begin if GetAsyncKeyState(VK_SNAPSHOT) <> 0 then MessageBox(0,'Спасибо за нажатие! Ваша картинка была сохранена удачно!','Windows XP',MB_OK); Done := True; end; Для того, чтобы ваша программа нормально скомпилировалась, нужно добавить в класс формы объявление нашей процедуры, чтобы он выглядел примерно следующим образом: type TForm1 = class(TForm) Button1: TButton; Timer1: TTimer; procedure AppIdle(Sender: TObject; var Done: Boolean); private { Private declarations } public { Public declarations } end; Осталось только затаить дыхание и подождать, пока после нажатия кнопки PrintScreen операционная система сообщит любезно пользователю, что его картинка сохранена удачно. Весьма неплохая функциональность. Определенно следует вернуться к варианту с переписыванием Windows:). На этом пока все. Присылайте мне свои письма с идеями, и помните, что идеи должны быть разумными и целесообразными для реализации (вот оно как завернул:)). Удачи и до новых встреч! P.S. Для тех, кто по каким-либо причинам не читал предыдущие статьи Fireangel, сообщаем номера КГ: 38, 40, 46 за 2003 год, 10, 17 за 2004 год, 2, 3, 4 за 2005 Паша Либер aka Fireangel, Fireangel@tut.by © Компьютерная газета
|
|