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

Панель задач - это тоже окно, поэтому на него можно помещать элементы управления, как и на Рабочий стол. Код добавления кнопки на Рабочий стол из предыду-\ щего раздела 3.9 может быть адаптирован для Панели задач следующим образом:

procedure TForml.Button2Click(Sender: TObject); var
h: HWND: begin
h := FindWindow('Shell_TrayWnd'. nil); windows.SetParent(Buttonl.Handle, h);
end;

Окно Панели задач имеет класс Shell_TrayWnd. Чтобы найти такое окно, можно воспользоваться функцией FindWindow. Функция ищет окно по заданному классу (первый параметр) и заголовку (второй параметр). Если какой-то параметр не надо учитывать, то его оставляем нулевым. В данном случае у окна Панели задач нет заголовка, поэтому его не учитываем при поиске

Давайте создадим новый проект и рассмотрим некоторые приемы, которые относятся именно к Панели задач.

Для начала посмотрим, как можно установить меню. Мы уже устанавливали меню на все окна подряд, но если нужно затронуть только Панель задач, воспользуйтесь следующим кодом:

procedure TForml.ButtonlClick(Sender. TObject); var
h: HWND;
begin
h := FindWi ndow('Shell_TrayWnd'. nil): SetMenu(h, MainMenul.Handle):
end:

Для компиляции и выполнения кода на форму нужно поместить компонент TMain-Menu и создать в нем несколько произвольных пунктов меню. Обработчики создавать не имеет смысла, потому что в Панели задач они обрабатываться не будут. Меню также не будет видно в Windows ХР/2003, если используются темы. Если выбран классический стиль Windows 9х/2000, то меню будет видно (рис. 3.14).

3.10. Панель задач

Рис. 3.14. Панель задач с меню

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

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

Добавим на нашу форму кнопку. По нажатии этой кнопки (событие OnClick) напишем следующий код:

procedure TForml.ЬЕ11ipceClick(Sender: TObject): var EllipseRgn: HRGN; h: HWND: begin EllipseRgn :- CreateEllipticRgnQ. 1. Screen.Width. 200):

h := FindWindow( "Shel^TrayWnd". nil);
SetWmdowRgn(h. EllipseRgn.True):
end:

Такая запись изменяет форму Панели задач на овальную (рис. 3.15). В обработчике объявлены две переменные:

• ЕП1 pseRgn - для хранения формы (региона) окна;

• h - указатель на окно Панели задач.

Для создания овальной формы окна используется функция CreateEl 1 ipticRgn, у которой имеется четыре параметра. Сначала задается прямоугольник, затем в него вписывается овал. После этих действий ищем окно Панели задач и назначаем для него овальную форму. Для задания формы используется функция SetWindowRgn, имеющая три параметра:

• hwnd - окно, для которого указывается форма;
• hRgn - форма (регион);

• bRedraw - еели этот параметр имеет значение true, то ОС перерисовывает окно сразу после изменения формы.

3.10. Панель задач

Рис. 3.15. Овальная Панель задач

Пользы от этого примера не много, потому что с овальной Панелью задач неудобно работать, но в шуточной программе эту возможность очень удобно использовать. Давайте добавим на форму нашего примера еще одну кнопку и по ее нажатии (обработчик события OnCl ick) напишем код из листинга 3.10.

Листинг 3.10. Анимация формы Панели задач

procedure TForml.bAnimTaskBarClick(Sender: TObject). var
EllipseRgn: HRGN: h: HWND:
index. iAdd: Integer: begin
h := FindWindowCShel^TrayWnd". nil):
index := 1: iAdd := 1:

while true do begin // Установка новой формы (региона) EllipseRgn := CreateEllipticRgn(index, 1, Screen.Width-index. 200); SetWi ndowRgn(h. El 1i pseRgn.True):

index := index+iAdd:

// Изменяем приращение if index > 200 then iAdd := -1: if index < 0 then iAdd := 1:

end:
end;

В этом примере запускается бесконечный цикл (while true do) внутри которого меняется форма Панели задач на овальную. Форма овала постепенно то увеличивается, то уменьшается, создавая анимацию.

Во время моих исследований Панели задач я заметил еще один интересный эффект. Допустим, что панель расположена, как принято по умолчанию, внизу. Теперь если ее расширять вверх, то она будет заполнять всю нижнюю область. Но если придать Панели задач прямоугольную форму с небольшим значением высоты, то эффект растягивания исчезнет.

Реализуем вышесказанное на примере. Добавим новую кнопку на форму нашего проекта и по ее нажатии запишем следующий код:

procedure TForml.bRectClick(Sender: TObject): var
EllipseRgn: HRGN: h: HWND: begin
EllipseRgn •= CreateRectRgnd. 1. Screen Width. 50):
h := FindWindow(,Shell_TrayWnd'. nil). SetWindowRgn(h. El 1i pseRgn,True), end:
3.10. Панель задач

Рис. 3.16. Панель задач, оторванная от нижней части экрана

Код схож с тем, что мы использовали при назначении Панели задач овальной формы, только здесь создается прямоугольная форма с помощью функции Сгеа1е-кеЛкдп. Для задания высоты формы взято значение в 50 пикселов, и теперь панель никак не сможет быть больше указанного значения. Получается, что Панель задач как бы оторвана от нижней части экрана (рис. 3.16).

ПРИМЕЧАНИЕ -

Исходный код рассмотренного здесь примера находится на компакт-диске в каталоге БоигсеБ^пОЗУГаБкВаг.

3.9. Рабочий стол || Оглавление || 3.11. Шутки над мышью


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