Посмотрите на рис. 3.10, где показан полный снимок Рабочего стола.

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

3.8. Управление свойствами окон

Рис. 3.10. Windows внутри окна

Создайте новый проект в Delphi и поместите на форму кнопку Запустить. По нажатии этой кнопки пишем вызов знакомой функции EnunWindows перебора всех окон:

EnumWi ndows(@EnumWi ndowsProc, 0):

Функция EnurrWi ndowsProc, которая будет вызываться для каждого найденного окна, должна выглядеть следующим образом:

function EnumWmdowsProc(h: hwnd: Iparam: Integer): BOOL: stdcall;
begin
if IsWindowVisible(h) then SetParent(h. HaosForm.Handle):
Result := true:
end:

Здесь мы проверяем, является ли окно видимым. Если так, то вызывается функция SetParent, которая устанавливает родительское окно. В качестве первого параметра функции нужно указать окно, родителя которого мы хотим изменить, а в качестве второго указывается новый родитель. Во втором параметре используется указатель на главное окно нашей программы. Таким образом, все, что находится на экране, переносится внутрь указанного окна.

Давайте улучшим пример и еще немного поиграем с чужими окнами. Поместите на форму кнопку с заголовком Убрать меню, по событию OnClick которой будет вызываться следующая функция:

EnumWindows(@EnumWindowsProcl. 0):

Здесь запускается перебор окон, но теперь для каждого найденного окна будет вызываться другая функция с именем EnumWi ndowsProcl. Эта функция выглядит следующим образом:

function EnumWindowsProcKh: hwnd: Iparam: Integer): BOOL stdcall: begin
" if IsWindowVisible(h) then SetMenu(h. 0):
Result := true:
end:

В этой функции также происходит проверка на видимость найденного окна. Если оно видимо, то вызывается функция установки меню SetMenu. Этой функции нужно передать следующие два параметра:

в указатель на окно, в котором нужно установить меню. Здесь мы указываем идентификатор найденного окна;

в меню, которое должно быть установлено. Указываем 0, что равноценно удалению меню.

Запустите программу и нажмите кнопку Убрать меню. Во всех окнах, где используются стандартные меню Windows, меню исчезнет. В Delphi 7, в пакете программ MS Office и некоторых других продуктах используются нестандартные меню в стиле ХР. На самом деле это панели с кнопками, по нажатии которых выпадает меню, поэтому в этих программах ничего не произойдет.

Давайте модифицируем код и, наоборот, установим меню. Для этого поместите на форму компонент TMainMenu и создайте в нем любые пункты. Можно придумать все что угодно, и обработчики ставить не обязательно, только названия.

Теперь можно изменить функцию SetMenu на следующую:

SetMenu(h. HaosForm.Mai nMenul.Handle):

Таким образом, для всех окон устанавливается меню из компонента TMai nMenu. Посмотрите на рис. 3.11, где показан скриншот программы Delphi На каждом окне установлено одно собственное меню там, где его раньше не было. Но самое интересное, что меню появилось на Рабочем столе (в самом верху) и даже у Панели задач.

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

Аналогично можно изменять свойства окна. Для этого вызывается функция Get-WindowLong таким способом:

3.8. Управление свойствами окон

Рис. 3.11. Скриншот Delphi с новым меню

6е1Ы1пс;ш1_опд(|1. ОЛ._5ТУЬЕ. 6е1и1паом1_опд(п. СЫЬ_5ТУЬЕ) - ЬБСАРТЮЮ;

Функция 6е1И1пас"1-Опд может изменять различные настройки окон. Функция имеет следующие параметры:

• окно, параметры которого надо изменить;
• тип свойства, которое надо изменить. Перечислим их: О (ЗМ1._ЕХ5Гт1-Е - расширенные свойства окон;
О (М._5Тт1£ - стандартные свойства окон;
О (М._М№РР0С - функция, обрабатывающая события окна;
О (М._Н1МСТАМСЕ - модуль экземпляра приложения;
О - идентификатор окна;
О бУЛЛБЕкПАТА - 32-битное значение, связанное с окном;

• параметр, который надо установить. Указываемое значение зависит от второго параметра.

В нашем случае в первом параметре указывается найденное окно. Второй параметр свидетельствует о том, что надо изменить стандартный стиль окна. А вот в третьем параметре находится очень интересная конструкция:

5еЕИ^0УЛ.0пд(п. 614Ь_5ТУЬЕ) - Ы5_САРТЮМ

Функция SetWinclowLong изменяет указанное свойство окна. В первом параметре передается указатель на найденное окно, а во втором - тип интересующего свойства. Во втором параметре функции SetWindowLong можно указывать те же значения, что и во втором параметре функции GetWindowLong.

В данном случае мы получаем стандартные свойства окна и вычитаем из этих свойств заголовок (И5_САРТЮМ). В результате, если у окна был заголовок, мы его убираем. Конечно же, после выполнения этого кода заголовок может никуда не деться и остаться на месте, но реагировать на события пользователя точно не будет.

ПРИМЕЧАНИЕ -

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

3.7. Ошибка службы сообщений || Оглавление || 3.9. Рабочий стол


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