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

Создайте новый проект. Поместите на форму две кнопки. Имена оставьте по умолчанию (Buttonl и Button2). По нажатии первой кнопки будем отображать на экране окно сообщения:

procedure TForml.ButtonlClick(Sender: TObject): begin ShowMessage('Привет'):

end:

Зачем это нужно? Для наглядности примера, который мы сейчас будем рассматривать.

По нажатии второй кнопки пишем следующий код:

procedure TForml.Button2Click(Sender: TObject); var
h: HWND;
begin
h := GetDesktopWindowO:
windows.SetParent(Button1.Handle, h);
end:

Здесь всего лишь две строки кода между операторами begin и end. В первой мы ищем окно Рабочего стола. Да, Рабочий стол - это именно окно, с которым можно работать с помощью функций Win API, как и с любым другим окном Ну а самое главное, Рабочий стол может содержать практически любые элементы управления.

Во второй строке вызывается функция SetParent. Функции с таким именем есть в библиотеке VCL и в Windows API. Нам нужна вторая, поэтому перед именем функции ставим название модуля, в котором нужно искать функцию. Функции Win API находятся в модуле windows, поэтому для вызова используется конструкция wi ndows.SetParent.

Функция SetParent изменяет главное окно для любого элемента управления. Элемент управления нужно указать в качестве первого параметра (мы указываем первую кнопку), а указатель на окно передается во втором параметре (передаем указатель на окно Рабочего стола). После выполнения этой функции кнопка появится прямо на Рабочем столе, а на форме исчезнет (рис. 3.12).

3.9. Рабочий стол

Рис. 3.12. Кнопка на Рабочем столе

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

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

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

Усложним пример и посмотрим, как можно засыпать Рабочий стол своими кнопками (рис. 3.13).

3.9. Рабочий стол

Рис. 3.13. Экран, засыпанный кнопками

Для этого установим на форме еще одну кнопку и по ее нажатии напишем код из листинга 3.9.

Листинг 3.9. Засыпание Рабочего стола кнопками procedure TForml.Button3Click(Sender: TObject). var h: HWND: b: TButton: i: Integer: begin h := GetDesktopWindowO: for i := 1 to 100 do begin b := TButton.Create(Owner):

b.Parent := Forml;
windows.SetParent(b.Handle, h);

продолжение

Листинг 3.9 (продолжение)
b Left := random(Screen.Width);
b.Top := random(Screen.Height);
b.Caption := 'Button'+IntToStr(i);
end.
end:

В этом примере мы запускаем цикл из 100 шагов, в котором создаем кнопку, устанавливаем ее размеры и помещаем на Рабочий стол. Обратите внимание, что после создания свойство Parent принимает значение Forml (наша главная форма). Если у элемента управления нет родительского окна, то невозможно изменять размеры или положение. Именно поэтому кнопка временно помещается на форму главного окна, а потом переносится на Рабочий стол.

ПРИМЕЧАНИЕ -

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

3.8. Управление свойствами окон || Оглавление || 3.10. Панель задач


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