Чтение онлайн

на главную - закладки

Жанры

Шрифт:

Удаление флага стиля производится аналогично добавлению, просто над битами стиля окна выполняется другая операция (листинг 10.10).

...

Листинг 10.10.

Удаление оконного стиля

procedure TfrmWindowProp.cmbDelStyleClick(Sender: TObject);

var

style: DWORD;

delstyle: DWORD;

begin

if lstStyle.ItemIndex = –1 then Exit;

//Удаление выбранного стиля окна

//..определяем, какой стиль удалить

delstyle := styles[GetStyleIndex(lstStyle.ItemIndex, True)].value;

//..вычисляем и устанавливаем новое значение стиля окна

style := GetWindowLong(wnd, GWL_STYLE);

style := style and not delstyle;

SetWindowLong(wnd, GWL_STYLE, style);

//..перерисуем

все окна

InvalidateRect(0, nil, True);

//Обновим список стилей окна

LoadWindowStyle;

end;

После удаления или добавления оконного стиля вызывается перерисовка всех окон, чтобы проявился результат проведенной операции. Удаление и добавление дополнительных (расширенных) оконных стилей осуществляется аналогично. Только при этом используются массив exstyles, функция GetExStylelndex и константа GWL_EXSTYLE, передаваемая в функции GetWindowLongи SetWindowLong.

Что же за функция GetStylelndex используется в листинге 10.10? Она позволяет определить положение в массиве styles стиля, выбранного в списке доступных или используемых стилей (верхний список) (листинг 10.11).

...

Листинг 10.11.

Определение положения записи о нужном стиле

function TfrmWindowProp.GetStyleIndex(listIndex: Integer;

used: Boolean): Integer;

var

i, count: Integer;

begin

count := 0;

for i := 0 to 17 do

if styles[i].used = used then

begin

if count = listIndex then

begin

//Нашли

GetStyleIndex := i;

Exit;

end;

Inc(count);

end;

GetStyleIndex := 0;

end;

Функция GetStylelndex принимает в качестве параметров номер строки в соответствующем списке и логическое значение, от истинности или ложности которого зависит, используемые или неиспользуемые стили будут подсчитываться внутри функции.

Применение функции GetStylelndex и введение в структуру Styleinf о поля used несколько усложняет алгоритм работы с массивом стилей, но зато позволяет избавиться от постоянного перемещения данных, например, из массива доступных стилей в массив используемых стилей. К тому же пришлось бы использовать по два массива для обычных и дополнительных оконных стилей.

Перехват сообщений

Теперь рассмотрим самую сложную часть программы, отвечающую за перехват сообщений выбранного окна. Форма, ведущая статистику перехваченных сообщений, приведена на рис. 10.5.

Показанная на рис. 10.5 форма имеет имя frmMessages.

Перехватчик сообщений состоит из двух частей: части программы (ЕХЕ), отвечающей за построение фильтра сообщений, а также обрабатывающей перехваченные сообщения, и ловушки, заключенной в DLL(hook\hook.dll).

Взаимодействие ловушки и ЕХЕ-файла построено по следующей схеме.

1. Из приложения вызываются функции создания и удаления ловушки (расположенные в DLL).

2. При перехвате каждого сообщения функция-ловушка посылает окну (форме) frmMessages сообщение WM_SPY_NOTIFY (определенное пользователем, точнее, программистом сообщение, листинг 10.12).

Рис. 10.5. Форма перехвата сообщений

Но ведь ловушка предназначена для работы в другом процессе, а если так, то как ей дать знать, какому именно окну посылать сообщения? Для этого и используется именованная проекция файла в память, в которой сохраняются данные, необходимые для ловушки. В проекции файла ловушка также сохраняет информацию о перехваченном сообщении (код и параметры сообщения). Эта информация используется приложением, ведущим слежение. Данные в проекции файла хранятся в виде записи THooklnfo, объявленной в модуле HookData. В этом же модуле объявлены константа с именем проекции файла, код сообщения WM_SPY_NOTIFY (листинг 10.12) и две служебные переменные,

использование которых будет пояснено далее.

...

Листинг 10.12.

Содержимое файла HookData.pas

type

//Структура (запись), которая хранится в разделяемом файле

//и используется для передачи данных между процессами

THookInfo = record

wnd: HWND; //Окно, за которым ведется наблюдение

hook_handle: HHOOK; //Дескриптор ловушки

spy_wnd: HWND; //Окно, уведомляемое о перехвате сообщения

//Следующие поля заполняются при перехвате сообщения

mess: UINT;

wParam: WPARAM;

lParam: LPARAM;

end;

var

//Указатель на разделяемую область памяти

hook_info: ^THookInfo;

//Дескриптор проекции файла в память

hFile: THandle;

const

//Имя проекции файла

strFileMapName = \'TricksDelphi_WinSpy_Mapping\

//Сообщение для уведомления окна-шпиона

WM_SPY_NOTIFY = WM_USER + 1;

Построение фильтра и обработка перехваченных сообщений

Теперь вернемся к приложению-шпиону, а точнее, к той его части, которая отвечает за работу формы, показанной на рис. 10.5.

Начнем с самого простого – управления фильтром сообщений. Он построен по тому же принципу, что управление списками оконных стилей (форма свойств окна, рассмотренная ранее).

Итак, структура, хранящая информацию о сообщении, выглядит следующим образом:

...

type MessageInfo = record

value: DWORD; //Код сообщения

name: String; //Название сообщения

used: Boolean; //Служебное поле

end;

При написании программы не стояла цель поместить в фильтр все возможные сообщения, поэтому массив messageslist (листинг 10.13) содержит только 16 элементов. При необходимости вы можете добавить нужные сообщения самостоятельно, взяв их обозначения из модуля Windows.

...

Листинг 10.13.

Сообщения, поддерживаемые программой

const

mess_first = 0;

mess_last = 15;

var

messages_list: array [mess_first..mess_last] of MessageInfo =

(

(value: WM_DESTROY; name: \'WM_DESTROY\ used: False),

(value: WM_MOVE; name: \'WM_MOVE\ used: False),

(value: WM_SIZE; name: \'WM_SIZE\ used: False),

(value: WM_ACTIVATE; name: \'WM_ACTIVATE\ used: False),

(value: WM_SETFOCUS; name: \'WM_SETFOCUS\ used: False),

(value: WM_KILLFOCUS; name: \'WM_KILLFOCUS\ used: False),

(value: WM_ENABLE; name: \'WM_ENABLE\ used: False),

(value: WM_SETTEXT; name: \'WM_SETTEXT\ used: False),

(value: WM_GETTEXT; name: \'WM_GETTEXT\ used: False),

(value: WM_PAINT; name: \'WM_PAINT\ used: False),

(value: WM_CLOSE; name: \'WM_CLOSE\ used: False),

(value: WM_QUIT; name: \'WM_QUIT\ used: False),

(value: WM_SIZING; name: \'WM_SIZING\ used: False),

(value: WM_MOVING; name: \'WM_MOVING\ used: False),

(value: WM_NOTIFY; name: \'WM_NOTIFY\ used: False),

(value: WM_NCHITTEST; name: \'WM_NCHITTEST\ used: False)

);

Загрузка фильтра (выбранных и невыбранных сообщений в соответствующие списки) производится очень просто (листинг 10.14).

...

Листинг 10.14.

Загрузка фильтра сообщений

procedure TfrmMessages.LoadFilter;

var

i: Integer;

begin

//Загрузка фильтра сообщений

lstAvailMessages.Clear;

lstSelMessages.Clear;

for i := mess_first to mess_last do

if messages_list[i].used then

//Сообщение перехватывается

lstSelMessages.Items.Add(messages_list[i].name)

else

lstAvailMessages.Items.Add(messages_list[i].name);

end;

Поделиться:
Популярные книги

Вкус ледяного поцелуя

Полякова Татьяна Викторовна
2. Ольга Рязанцева
Детективы:
криминальные детективы
9.08
рейтинг книги
Вкус ледяного поцелуя

Проблема майора Багирова

Майер Кристина
1. Спецназ
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Проблема майора Багирова

Прометей: владыка моря

Рави Ивар
5. Прометей
Фантастика:
фэнтези
5.97
рейтинг книги
Прометей: владыка моря

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

(Не)зачёт, Дарья Сергеевна!

Рам Янка
8. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
(Не)зачёт, Дарья Сергеевна!

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Дракон с подарком

Суббота Светлана
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Дракон с подарком

Отвергнутая невеста генерала драконов

Лунёва Мария
5. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Отвергнутая невеста генерала драконов

Случайная жена для лорда Дракона

Волконская Оксана
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Случайная жена для лорда Дракона

Тройняшки не по плану. Идеальный генофонд

Лесневская Вероника
Роковые подмены
Любовные романы:
современные любовные романы
6.80
рейтинг книги
Тройняшки не по плану. Идеальный генофонд

Идеальный мир для Лекаря 28

Сапфир Олег
28. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 28

Лейтенант космического флота

Борчанинов Геннадий
1. Звезды на погонах
Фантастика:
боевая фантастика
космическая фантастика
космоопера
рпг
фэнтези
фантастика: прочее
5.00
рейтинг книги
Лейтенант космического флота

Гарем на шагоходе. Том 5

Гремлинов Гриша
5. Волк и его волчицы
Фантастика:
боевая фантастика
фэнтези
5.00
рейтинг книги
Гарем на шагоходе. Том 5

Матабар III

Клеванский Кирилл Сергеевич
3. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар III