Вступление.
С этого момента я буду периодически публиковать исходники к некоторым программам, но не всегда, потому что знаю по себе, что исходник заставляет тебя лениться и ты не получаешь того опыта, который бы ты получил, если бы писал всё сам. Итак, приступим.
Невидимый враг.
Наша следующая программа будет ужасно проста, но тем не менее крайне опасна для тех людей, кто не умеет пользоваться Диспетчером задач.
Мы сейчас напишем программу, окно которой нельзя закрыть.
Вы спросите : «А в чем же тут прикол?»
А прикол в том, что вы из-за этой программы не сможете выключить компьютер, простите... нормально выключить компьютер.
Впрочем, если вы приучите кого-то к этой программе, засунув её, к примеру, в Автозагрузку, то мануальное отключение питания станет вполне обычным способом отключения компьютера.
Мелочно, но эффективно – согласитесь :)
Запускаем наше любимое Дельфи и создаем новое приложение, для главной формы которого мы будем использовать обработчик события OnCloseQuery. Данное событие будет генерироваться каждый раз, когда нужно закрыть окно, чтобы подтвердить возможность выполнения этой операции. Здесь нужно добавить только одну строчку:
CanClose := false
Вот как должна выглядеть процедура обработчика этого события:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=false;
end;
Переменная CanClose передается обработчику события в качестве второго параметра.
По умолчанию она имеет значение true, что означает, что окно МОЖЕТ закрываться.
Но если изменить значение на false, то окно мы уже НЕ сможем закрыть его.
Итак, компилируем программу и пробуем запустить – окно не будет реагировать на ваши попытки его закрыть, единственное, что можно сделать – это снять задачу в Диспетчере задач.
Теперь нам надо сделать нашу програмку невидимой.
Делается это следующим образом.
Создаем для главной формы еще один обрабочтик события OnActivate, который генерируется, когда окно уже создано и отображено и, соответственно, требует активации на рабочем столе. Прятать программму будем так:
procedure TForm1.FormActivate(Sender: TObject);
begin
ShowWindow(Handle, SW_HIDE);
ShowWindow(Application.Handle, SW_HIDE);
end;
Тут вызвается функция ShowWindow. Она имеет два параметра: указатель на окно и операция, которую надо произвести с этим окном. В обоих случаях мы указываем флаг SW_HIDE , который заставляет систему скрыть указанное окно.
В первой строке мы скрываем главное окно программы, передав функции ShowWindow указатель на это окно(Handle). Окно исчезнет, но оно будет видно в Панели задач, а чтобы убрать его и оттуда, мы снова вызываем функцию, но уже передаем указатель на приложение (Application.Handle).
Теперь запустите программу – она не будет видна. Попробуйте выключить компьютер. Ничего не будет происходить. Windows как работал, так и будет работать.
Почему же комп не вырубился ?
Когда вы выбираете «Завершение работы», то винда посылает всем приложениям сообщение, о том, что они должны завершить работу. Если какое-то приложение отказывается закрываться, то отключение невозможно.
На главном окне ставим одну кнопку, по нажатию которой(OnClick) будет происходить закрытие окна, которое мы укажем.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
wnd:HWND;
begin
wnd:=FindWindow(nil, 'Безымянный - Блокнот');
if wnd<>0 then
PostMessage(wnd, WM_QUIT, 1,0);
CloseWindow(wnd);
end;
Тут создается переменная типа HWND для сохранения идентификатора окна, которое мы закрываем. Но для начала мы должны найти это окно, то есть использовать функцию FindWindow. Ей надо передать два параметра: класс окна и текст в заголовке окна.
Чтобы не усложнять себе жизнь определением класса, оставляем параметр нулевым nil.
А искать будем по второму параметру, для примера тут указан заголовок создаваемого по умолчанию текстового документа в Блокноте. Результат поиска сохраняем в отдельной переменной wnd. Далее прверяем результат на наличие ненулевого значения, то есть найденного окна, или же наоборот, необнаруженного.
Далее посылаем сообщение этому окошку, в котором содержится:
- Идентификатор окна
- Тип сообщения, нас интересует выход – WM_QUIT
- WParam – первый параметр сообщения
- LParam – второй параметр сообщения.
Открываем пустой документ в Блокноте и запускаем нашу прогу, документ должен закрыться.
Тут прикола нет – не ищите, я только показал как это делается, если же вы добавите сюда чуть-чуть воображения, то можете сделать очень много неплохих комбинированных.
It`s up to you – как говорят в англоязычных странах.
Невидимый враг - исходник
Как закрыть чужое окно ? - исходник
0 коммент.:
Отправить комментарий