Начнем с простейшей задачи, но подойдем к ней немного изощренно - напишем программу, главное окно которой нельзя закрыть. "Прикол" будет состоять в том, что благодаря этому нельзя будет нормально выключить компьютер.

Задача решается просто. Создайте новое приложение и для главной формы используйте обработчик события OnCl oseQuery. Событие будет генеририроваться каждый раз, когда нужно закрыть окно, чтобы подтвердить возможность выполнения этой операции. Здесь нужно добавить только одну строку:

CanClose :- false

Вот как должна выглядеть процедура обработчика данного события:

procedure TForml.FormCloseQuery(Sender TObject;
var CanClose: Boolean): begin
CanClose := false:
end:

Переменная CanCl ose передается обработчику события в качестве второго параметра. По умолчанию она имеет значение true, и окно может закрываться. Но если изменить значение на f al se, то окно закрывать нельзя.

Откомпилируйте программу и попробуйте ее запустить. Окно не будет реагировать на ваши попытки. Единственное, что можно сделать, - снять задачу.

Теперь немного усложняем пример и делаем окно невидимым. Создадим для главной формы еще один обработчик события OnActivate, который генерируется, когда окно уже создано, отображено и требует активирования на рабочем столе. Мы будем прятать наше приложение от глаз пользователя следующим образом:

procedure TForml.FormActivate(Sender TObject): begin
ShowWindow(Handle. SW_HIDE);
ShowWindow(Application.Handle, SW_HIDE);
end:

Здесь две строки, в которых вызывается функция ShowWi ndow. Функция имеет два параметра: указатель на окно и операция, которую надо произвести. В обоих случаях в качестве операции указываем флаг SWHIDE, который заставляет систему скрыть указанное окно.

В первой строке мы скрываем главное окно программы, передав функции Show-Window указатель на это окно (Handle). Таким образом, окно исчезнет, но приложение еще будет видно в Панели задач. Чтобы убрать его и оттуда, снова вызываем ShowWi ndow, но передаем уже указатель на приложение (Application. Handle).

Теперь запустите программу, - она нигде не будет видна. Попробуйте выключить компьютер. Ничего не будет происходить. Windows как работал, так и будет продолжать работать. Через пару минут ожидания проведите указателем мыши по пиктограммам рядом с системными часами. Они могут исчезнуть, потому что все программы завершают работу.

Почему компьютер не выключился? Когда вы выбираете меню Пуск ► Завершение работы, то ОС посылает всем активным приложениям сообщение о том, что они должны завершить работу, и ожидает корректного завершения. Если какое-то окно "отказывается" закрываться, то выключение невозможно. Это сделано для того, чтобы у вас была возможность сохранить измененный документ, о котором вы могли забыть, когда начинали завершение работы.

Вот так, наше невидимое окно не закрывается и не позволяет обычными средствами выключить компьютер. Чтобы завершение работы прошло успешно, нужно снять задачу и после этого повторить попытку. Если пользователь не увидит задачу, то единственный выход - выключать компьютер кнопкой на системном блоке, что является не совсем корректным выключением. Какие-то данные или настройки могут не сохраниться и потеряться, не говоря о проблемах с жестким диском, если он отформатирован в FAT 32.

ПРИМЕЧАНИЕ -

Исходный код рассмотренного здесь примера находится на компакт-диске в каталоге Sources\ch03\BadWindow.

Шуточки || Оглавление || 3.2. Закрыть чужое окно


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31