Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
ВнизОтключение ловушки Найти похожие ветки
← →
Destroyer2 (2004-12-07 14:14) [0]Добрый день. В своей программе мне надо было реализовать ловушку (hook) на нажатие кнопок клавы (в любом процессе). Я нашел код для dll, который должен реализовать эту ловушку. Ловушка работает отлично, но, после отлова хотя бы одного сообщения от клавы, если выйти из моей проги, то удалить dll нельзя ("Используется Windows"). Помогите разабраться плиз, почему ловушка не отключается. Вот код dll:
library KBHook;
uses
SysUtils, Classes, Windows, Messages;
const
WM_CATCHHOOK=WM_USER+$FF;
HookHandle:hHook=0;
var
SaveExitProc:Pointer;
H:Hwnd;
{собственно ловушка}
function Key_Hook(Code:Integer;wParam:Word;lParam:Longint):Longint; stdcall; export;
begin
if (Code>=0) then
begin
SendMessage(H,WM_CATCHHOOK,0,0);
Result:=0;
end
else
Result:=CallNextHookEx(HookHandle,Code,wParam,lParam);
end;
procedure LocalExitProc; far;
begin
if HookHandle<>0 then
UnhookWindowsHookEx(HookHandle);
ExitProc:=SaveExitProc;
end;
exports Key_Hook;
begin
H:=FindWindow("TMainForm", "Header");
HookHandle:=SetWindowsHookEx(WH_Keyboard,@Key_Hook,hInstance,0);
if (HookHandle=0) then
MessageBox(0,"Unable to set hook!","Error",mb_Ok)
else
begin
SaveExitProc:=ExitProc;
ExitProc:=@LocalExitProc;
end;
end.
← →
Leonid Troyanovsky (2004-12-07 14:36) [1]
> Добрый день. В своей программе мне надо было реализовать
> ловушку (hook) на нажатие кнопок клавы (в любом процессе).
> Я нашел код для dll, который должен реализовать эту ловушку.
> Ловушка работает отлично, но, после отлова хотя бы одного
> сообщения от клавы, если выйти из моей проги, то удалить
> dll нельзя ("Используется Windows"). Помогите разабраться
> плиз, почему ловушка не отключается. Вот код dll:
> exports Key_Hook;
> begin
> H:=FindWindow("TMainForm", "Header");
> HookHandle:=SetWindowsHookEx(WH_Keyboard,@Key_Hook,hInstance,0);
> if (HookHandle=0) then
> MessageBox(0,"Unable to set hook!","Error",mb_Ok)
> else
> begin
> SaveExitProc:=ExitProc;
> ExitProc:=@LocalExitProc;
> end;
> end.
Оный код выполняется при каждой загрузке библиотеки,
т.е., немеренно. Т.к. выполняет его загружающий поток,
то и освободить ее никак нельзя.
Т.е., экспортировать надо не key_hook, а SetKeyHook.
Кроме того, надо обеспечить доступность значения HookHandle
в других экземплярах dll, работающих в чужих процессах
(см. CreateFileMapping etc.)
Короче говоря, пример ты выбрал плохой (а их как грязи).
--
С уважением, LVT.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.039 c