Листинг 10.19.
Обработка сообщения WM_SPY_NOTIFY
procedure TfrmMessages.WndProc(var Message: TMessage);
var
item: TListItem;
i: Integer;
begin
if (Message.Msg = WM_SPY_NOTIFY) and (hook_info <> nil) then
begin
//Обрабатываем уведомление о приходе сообщения в наблюдае-
мое окно
for i := mess_first to mess_last do
if (messages_list[i].value = hook_info^.mess) and
messages_list[i].used then
begin
//Сообщение выбрано в фильтре – добавим запись в список
item := lvwMessages.Items.Add();
item.Caption := messages_list[i].name;
item.SubItems.Add(IntToStr(hook_info^.wParam));
item.SubItems.Add(IntToStr(hook_info^.lParam));
end;
end
else
inherited WndProc(Message);
end;
Ловушка
Теперь обратимся к реализации самой ловушки. По рассмотренным ранее причинам ловушка размещена в отдельной DLL (hook\hook.dll на прилагаемом к книге диске в папке с номером главы). На случай, если вы не знакомы с созданием DLL средствами Delphi, приведем краткие сведения.
Среда программирования Delphi замечательна тем, что позволяет просто делать довольно сложные вещи. Хотя и при использовании сред разработки, скрывающих меньшее количество сложных деталей, например Visual C++, создание DLL не является очень сложной задачей. Итак, для создания DLL в простейшем, то есть нашем, случае достаточно выполнить следующие действия.
1. Создать соответствующий проект (с помощью команды меню FiLe → New → Other, тип проекта – DLL Wizard) (рис. 10.6).
2. В DPR-файле получившегося проекта реализуем функции, которые предполагается экспортировать.
3. Объявляем, какие функции нужно экспортировать с помощью ключевого слова exports (листинг 10.20).
Рис. 10.6. Создание проекта DLL
Структура DLL ловушки, реализованной в нашем примере, приведена в листинге 10.20.