Листинг 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 функций. Они подключаются следующим объявлением: