Очень интересного эффекта можно добиться, если получить доступ к чужим окнам. Любой пользователь реагирует на такие вещи неожиданно и может получить кратковременный шок. Сейчас мы посмотрим, как можно перебирать все окна на экране и случайным образом выводить любое из них поверх всех. Цикл перебора будет бесконечным, поэтому через разные промежутки времени поверх всех окон будет появляться какое-нибудь окно.

Создайте новое приложение и поместите на форму только одну кнопку. По нажатии этой кнопки напишем следующий код:

procedure THaosForm.bStartClick(Sender: TObject);
begin
while (true) do
EnumWindows(@EnumWindowsProc. 0):
end:

Здесь запускается бесконечный цикл, в котором вызывается функция Win API EnumWindows. Эта функция используется для перебора всех окон на Рабочем столе. Для каждого найденного окна будет вызываться функция, указанная в качестве первого параметра; в нашем случае это EnumWindowsProc (листинг 3 5).

Листинг 3.5. Случайным образом сворачиваем найденное окно

function EnumWindowsProc(h: hwnd;
lparam- Integer): BOOL: stdcall: begin
if IsWindowVisible(h) then if random(lOO) = 4 then SetForegroundWindow(h):
Result .= true:
end.

В качестве первого параметра функции EnumWindowsProc мы получаем идентификатор найденного окна. Именно с ним мы и будем в дальнейшем работать.

Сначала проверяем, является ли окно видимым. Если нет, то не стоит даже пытаться выводить такое окно поверх остальных. Для этой проверки существует функция IsWindowVisible, которой нужно передать единственный параметр - идентификатор окна, и если оно видимо, то функция возвратит значение true, в противном случае - fal se.

Если окно видимо, то его можно отобразить поверх остальных, но если каждое окно "дергать" наверх, то это будет некрасиво. Давайте сгенерируем случайное число от 0 до 100, и если полученный результат будет равен 4, то только тогда отображать окно поверх всех. Для генерации случайного числа будем использовать стандартную функцию random.

Для вывода окна поверх остальных можно воспользоваться функцией SetForeg-roundWindow - ей достаточно передать идентификатор нужного окна.

Для большего эффекта можно сделать программу невидимой, и тогда пример можно "подбросить" кому-нибудь на компьютер.

ПРИМЕЧАНИЕ -

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

Перебирая окна, можно добиться множества эффектов. Давайте будем сворачивать все окна в бесконечном цикле.

В листинге 3.6 приведен код функции EnumWindowsProc, в которой видимые окна сворачиваются. Для этого применяется функция ShowWindow, где в качестве первого параметра указывается найденное окно, а второй параметр, - флаг SWMINIMI-ZE - указывает на необходимость свернуть окно. Если заменить флаг SWMINIMIZE на SW_HIDE, то все найденные окна будут исчезать. Вы только представьте себе пользователя, у которого на глазах пропадают все окна запущенных программ,- какую бы программу он ни запустил, окно тут же исчезает!

Листинг 3.6. Сворачиваем все окна

function EnumWindowsProcCh: hwnd;
lparam: Integer): BOOL: stdcall. begin
if IsWindowVisible(h) then if random(lOO) = 4 then ShowWindow(h. SW_MINIMIZE);
Result := true;
end;

3.3. Шутки над буфером обмена || Оглавление || 3.5. Сервисы


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