Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1101910353
Змей
2004-12-01 17:12
2004.12.19
listview


14-1101355616
Кто---то
2004-11-25 07:06
2004.12.19
Как скопировать ассемблер из дебаггера Дельфи ?


1-1102107387
Bobby Digital
2004-12-03 23:56
2004.12.19
PopUpmenu


1-1102407125
Владимир
2004-12-07 11:12
2004.12.19
ListView


1-1102037045
Oitxr
2004-12-03 04:24
2004.12.19
скрытые файлы и папки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский