...
...

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

Здраствуйте. Напишите програму, штоб взламать интернет. А то мне радители там сидеть на дают.
Серега
Из письма на мой адрес (стиль написания и пунктуация соблюдены)


Очередной привет всем любителям компьютерного юмора из разряда "сделай сам" и среды разработки 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

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

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