Нас ребут, а мы крепчаем!

Итак, начнем! Берем твою любимую Дельфю и создаем новый проект (в меню главного окна: File -> New Application).

Я не люблю всяких имен по дефолту, поэтому сразу обзываем появившуюся форму, например, 'SuperForm' (в Object Inspector`е поле 'Name'), меняем ее заголовок (Caption) на что-нибудь типа 'sHUTiTdOWN - не дай виндам засохнуть!' и делаем ее диалогом: BorderStyle правим на bsDialog. Теперь тащим на форму label, checkbox, два radiobutton`а, прогрессбар и таймер. Что, грузанул я тебя? Ну, тогда объясняю в чем маза: label - просто текст на окне, checkbox - пимпа с флажком, radiobutton - круглая фигулька с точкой внутри (все это во вкладке 'Standard' списка компонентов), progressbar показывает прогресс выполнения какого-нибудь процесса (например, когда ставишь софтину в setup`е, он показывает, сколько файлов скопировано, и т.п.), находится этот бар во вкладке 'Win32', а таймер и в Гондурасе таймер (вкладка 'System'). Эти фичи нужны для пущего западла, а вот label тебе пригодится во время отладки проги или когда будешь заценять, как она пашет: через него ты будешь шатдаунера нашего закрывать.

"Все еще только начинается!" ;-) (C) Санта-Барбара

Все свойства объектов меняются просто: выбираешь жертву истязаний и в Object Inspector`е редактируешь нужное свойство.

Сначала обзовем радиобатоны и поменяем их подписи (Caption): первый - на 'ToPowerOff', кэпшн - на 'повер офф!'; второй - на 'ToReboot', кэпшн - на 'ребут'. Это все нам дальше пригодится. Таймер называем 'DeathTimer', а прогрессбар просто: 'ProgressBar'. Теперь меняем имя чекбокса на 'ForceBox' и кэпшн на что-то типа 'Force - с потерей всех данных', а вообще по твоему вкусу. Эта феня нужна для очередного глумления над твоим приятелем, заюзающим эту прогу. Представь: жмет он на него, жмет, а винды все равно отрубятся в режиме 'force', т.е. никто не будет спрашивать у запущенных приложений разрешения на взлет. Ты еще помнишь про ма-аленький label (или он у тебя во все окно получился? :))? Вспоминай! Он нам дальше пригодится, а пока лучше назови его 'Title' и напиши в нем заголовок проги, например, 'sHUTiTdOWN'.

Займемся кодингом

Для начала сделаем самое простое - объявим нужные для работы переменные. Делать это будем в разделе implementation, зачем - поймешь сам, если ненадолго включишь мозгу. Итак, вводим вот что:


var  
progress : integer; //сколько набежало в прогрессбаре  
Want2SwitchOff : byte = 0; //сколько раз кликнули по label`у, чтобы прога   
закрылась  
ReallyClose : boolean = false;//после 5-ти кликов будет true, и все, финита   
:)  

Если ты пока не понял, для чего эти переменные нужны, не кидай ломом в монитор! :) Скоро все станет ясно даже одноногой табуретке :)).

Теперь нужно сделать так, чтобы сколько наш бедный ламер на чекбокс ни давил, флажок все равно стоял. :) Делается это так: кликаешь два раза по твоей пимпе с флажком и в открывшемся окне редактирования кода, внутри функции ForceBoxClick, пишешь:


ForceBox.Checked := true;  

Готово! Сейчас сделаем, чтобы прогу обычными средствами (Alf-F4 или крестиком) нельзя было отрубить. Выбираем вкладку 'Events' в свойствах формы (все как обычно в Object Inspector`е), а там создаем обработчик события OnClose. В нем пишем:


if (ReallyClose) then  
Action := caFree  
else Action := caNone;  

Этот код не будет позволять окну нашего шатдаунера закрываться, пока переменная ReallyClose равна false. А зачем она нужна? Дык надо оставить какой-нибудь бекдор, чтобы самому прогу можно было тормознуть! Помнишь, я говорил, что лейбл пригодится? Время обратиться к этому title`у! Опять тыкаешь два раза крысиной пимпой, но только уже по нему. В появившемся окне с сорцами пишем (внутри функции TitleClick!):


Want2SwitchOff := Want2SwitchOff + 1;  
if (Want2SwitchOff = 5) then  
begin  
ReallyClose := true;  
SuperForm.Close();  
end;  

Что это такое? Ни что иное, как закрывашка (типа открывашки для пива, только наоборот)! Объясняю: после каждого клика по label`у переменная Want2SwitchOff будет увеличиваться на один. Если она станет равной пяти, прога вырубается! Все просто. :)

Да будет свет!

Перейдем к главному - самому процессу отрубания виндов. Будем мы их отрубать по желанию трудящихся, т.е. так, как трудящиеся соизволили выбрать: повер офф, или ребут. Да, еще нужно сделать, чтобы прогрессбар работал. Думаешь, геморрой? Да всего-то пара строк:


progress := progress + 1;  
if (progress <= 100) then ProgressBar.StepIt  
else  
begin  
if (ToReboot.Checked) then  
ExitWindowsEx(EWX_REBOOT or EWX_FORCE, 0);  
if (ToPowerOff.Checked) then  
ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0);  
end  

А теперь догадайся, куда этот код всунуть надо? Нет, туда, куда ты хочешь (конечно, можешь засунуть для опыта :), но в кодинге это не поможет)! Все опять очень просто. Был там у нас таймер, который до сих пор не заюзан. Сечешь фишку? Нужен он для того, чтобы на прогрессбар полоски двигать и, в конце концов, комп зашатдаунить (или ребутить). Поэтому, как обычно, тыкаем по таймеру два раза. Появился обработчик события OnTimer. Это событие обрабатывается после истечения интервала таймера, который изменяется в свойстве Interval (единица - тысячная секунды). Поставь там 100, чтобы у жертвы слишком много времени на раздумье не было. :)

Осталось разобрать сам код. Переменная progress показывает, сколько у бара процентов накипело. Когда progress доходит до ста, начинается процесс отрубания виндов. Очень меня радует, что их можно вырубить вызовом всего одной функции - ExitWindowsEx. :) У функции этой два параметра: первый - флаг, он говорит что делать (EWX_LOGOFF - завершение сеанса пользователя, EWX_REBOOT - ребут, EWX_SHUTDOWN - шатдаун, EWX_POWEROFF - (не догадался?) повер офф), а второй зарезервирован и, по уверениям мелкомягких, игнорируется. EWX_POWEROFF работает только на машинах, которые его поддерживают, т.е. на ATX`ах. Если ты сомневаешься, что за комп у жертвы, лучше поставь EWX_SHUTDOWN, который доведет шатдаун до стадии 'Сеанс Windows завершен. Вы можете выкинуть свой компьютер'. :) Разобрался с флагами? Для них-то и юзаем if-else: он проверяет, какой радиобокс выбран, и делает свое дело. Voila!

Outroе

Вот и все! Теперь ты можешь считать себя крутым компутерным zаподлянщиком :). Эта прога - самый простой прикол, который ты мог написать. Конечно, задачу шатдаунера можно реализовать и более крутыми способами, тысячами строк и т.п. Но ведь в том и фишка, что так ты посылаешь солить веники всех этих куль-кодеров, которые ваяют простейший алгоритм целыми томами строк с ненужными операторами? Такой геморрой может быть нужен опять-таки только для прикола: на олимпиадах по информатике, помню, писали проги на объектном паскале (со всеми конструкторами и деструкторами!), которые конвертят числа в разные таблицы счисления по указанному в примечании к заданию алгоритму :)).

По поводу же нашей проги даю домашнее задание. :)

Эта прога не будет пахать под NT. В NT`е нужно получить приоритет шатдауна для процесса, чтобы он смог отрубить систему. Как это сделать? Посмотри в Win32 API reference (только там на Си код в примере :)).
Чтобы сделать 'просто супербизона', поищи в хэлпах Дельфей про реестр виндов и заставь прогу вносить себя в группу запуска при старте форточек. :) Можешь еще поработать над дизигном. У меня в два счета получилось так:
Проявляй инициативу, работай мозгом, твори! Кодинг - захватывающее занятие, если им заниматься с увлечением. Особенно, когда ты творишь не для себя, а для людей (которым будешь вырубать винды ;)). Удачи тебе в твоих западлостроительных экспериментах!
Какой самый простой способ сделать так, чтобы винды плохо работали, а? Ни за что не угадаешь - надо сделать так, чтобы они вообще НЕ работали :). Этим мы и займемся: напишем прогу, которая будет их ребутить, шатдаунить, закрывать, затыкать, вырубать, гасить, валить, то есть попросту иметь. Ведь как люди выходят из-под окон? Кто-то, порывшись в инструкции, делает все, как дядя Билли прописал, кто-то, проклиная все дикими криками вымирающих динозавров, тычет Ctrl-Alt-Del, а кто-то просто при первом же обломе лезет давить Reset. А как это делают настоящие кул-хацкеры? Конечно, они пишут для этого специальную прогу, причем эта прога вырубает винды не им, а их врагам, ну или просто знакомым ламерам на крайняк... Хе-хе.
Теги:
чтобы, просто, будет, label, progress, сделать, прогу, Want2SwitchOff, прога, сколько, винды, функции, таймер, прогрессбар, ReallyClose, пригодится, Теперь, ребут, проги, Inspector, кэпшн, внутри, показывает, строк, виндов, POWEROFF, можно, ExitWindowsEx, после, например, повер, нужно, Object, будешь, Checked
Добавлено: 21 Июля 2018 12:24:16 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...