Читаем Delphi. Трюки и эффекты полностью

Листинг 10.16.

Перемещение сообщений между списками выбранных и доступных сообщений

procedure TfrmMessages.cmbAddMessageClick(Sender: TObject);

var

i: Integer;

begin

if lstAvailMessages.SelCount = 0 then Exit;

//Включение выбранных сообщений в список перехватываемых

for i := lstAvailMessages.Count – 1 downto 0 do

if lstAvailMessages.Selected[i] then

messages_list[GetMessageIndex(i, False)].used := True;

//Отобразим изменения в списках

LoadFilter();

end;

procedure TfrmMessages.cmDelMessageClick(Sender: TObject);

var

i: Integer;

begin

if lstSelMessages.SelCount = 0 then Exit;

//Исключение выбранных сообщений из списка перехватываемых

for i := lstSelMessages.Count – 1 downto 0 do

if lstSelMessages.Selected[i] then

messages_list[GetMessageIndex(i, True)].used := False;

//Отобразим изменения в списках

LoadFilter();

end;

Функция GetMessagelndex, используемая в листинге 10.16, реализована следующим образом (листинг 10.17).

...

Листинг 10.17.

Преобразование номера сообщения в списке в номер сообщения в массиве messages_list

function TfrmMessages.GetMessageIndex(listIndex: Integer;

used: Boolean):Integer;

var

i, count: Integer;

begin

count := 0;

for i := mess_first to mess_last do

if messages_list[i].used = used then

begin

if count = listIndex then

begin

//Нашли

GetMessageIndex := i;

Exit;

end;

Inc(count);

end;

GetMessageIndex := 0;

end;

Теперь обратимся к реализации главной функции, выполняемой формой: использованию ловушки. Итак, слежение за выбранным в дереве окном (дескриптор его сохранен в поле wnd при инициализации формы) начинается и заканчивается при нажатии кнопки cmbStart. Обработчик нажатия этой кнопки приведен в листинге 10.18.

...

Листинг 10.18.

Запуск/остановка перехвата сообщений

procedure TfrmMessages.cmbStartClick(Sender: TObject);

begin

if cmbStart.Caption <> \'Остановить\' then

begin

//Начинаем слежение

lvwMessages.Clear;

//Создаем проекцию файла

hFile := CreateFileMapping(INVALID_HANDLE_VALUE, nil,

PAGE_READWRITE,

0, SizeOf(THookInfo),

strFileMapName);

hook_info := MapViewOfFile(hFile, FILE_MAP_WRITE, 0, 0,

SizeOf(THookInfo));

//Создание ловушки

if InstallHook(wnd, frmMessages.Handle) then

cmbStart.Caption := \'Остановить\'

else

begin

//При ошибке удалим проекцию файла

UnmapViewOfFile(hook_info);

hook_info := nil;

CloseHandle(hFile);

hFile := 0;

MessageBox(Handle, \'Ошибка при создании ловушки\',

PAnsiChar(Application.Title), MB_ICONEXCLAMATION);

end;

end

else

begin

//Заканчиваем слежение (удаляем ловушку и проекцию файла)

RemoveHook();

UnmapViewOfFile(hook_info);

hook_info := nil;

CloseHandle(hFile);

hFile := 0;

cmbStart.Caption := \'Начать слежение\

end;

end;

Как можно увидеть, вся сложность на стороне приложения-шпиона состоит в создании/удалении проекции файла и в вызове двух экспортируемых из библиотеки hook, dll функций. Они подключаются следующим объявлением:

...

Перейти на страницу:

Похожие книги

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

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

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ

Эта книга представляет собой перевод третьего издания американского бестселлера Effective C++ и является руководством по грамотному использованию языка C++. Она поможет сделать ваши программы более понятными, простыми в сопровождении и эффективными. Помимо материала, описывающего общую стратегию проектирования, книга включает в себя главы по программированию с применением шаблонов и по управлению ресурсами, а также множество советов, которые позволят усовершенствовать ваши программы и сделать работу более интересной и творческой. Книга также включает новый материал по принципам обработки исключений, паттернам проектирования и библиотечным средствам.Издание ориентировано на программистов, знакомых с основами C++ и имеющих навыки его практического применения.

Скотт Мейерс , Скотт Майерс

Программирование, программы, базы данных / Программирование / Книги по IT