Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];

Вниз

Ставлю глобальный хук на клавиатуру, но клавиши не ловятся.   Найти похожие ветки 

 
Amadeus   (2003-12-19 00:08) [0]

Ставлю глобальный хук на клавиатуру. Когда нажимаю кнопки в своём приложении, то всё нормально. Но когда кнопки нажимаются в другом приложении, то эти нажатия не регистрируются.
Вот исходники Dll и exe-шника:

Код Dll
---------------------------
Library HookDLL;

Uses
Windows, Messages, SysUtils;

Const WM_MES=WM_USER+10000;

Var
HookHandle:THandle;
ProgHandle:THandle;

Function KeyboardHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
Begin
If Code<0 Then
Begin
Result := CallNextHookEx(HookHandle, Code, ParamW, ParamL);
Exit;
End;
SendMessage(ProgHandle, WM_MES, ParamW, Code);
Result := CallNextHookEx(HookHandle, Code, ParamW, ParamL);
End;

Function SetKeyboardHook(Wnd: HWND): BOOL; stdcall;
Begin
ProgHandle:=Wnd;
HookHandle:=SetWindowsHookEx(WH_KEYBOARD, @KeyboardHook, HInstance, 0);
End;

Function RemoveKeyboardHook: BOOL; stdcall;
Begin
Result:=UnhookWindowsHookEx(HookHandle);
End;

Exports
SetKeyboardHook, RemoveKeyboardHook;

BEGIN

END.

--------------------------------
Код exe-шника
--------------------------------
unit Main;
const WM_MES=WM_USER+10000;
...
Procedure WMMes(Var Message: TMessage); Message WM_MES;
...
Function SetKeyboardHook(Wnd: HWND): BOOL; stdcall; external "HookDLL.dll" name "SetKeyboardHook";
Function RemoveKeyboardHook: BOOL; stdcall; external "HookDLL.dll" name "RemoveKeyboardHook";
...
Procedure TForm1.WMMes(var Message: TMessage);
var element:string;
Begin
element:=GetElement(Message); // эта функция у меня получает символ, который потом записывается в Memo
Memo1.Lines.Add(element);
End;

procedure TForm1.Button5Click(Sender: TObject);
begin
SetKeyboardHook(Handle);
end;

procedure TForm1.Button13Click(Sender: TObject);
begin
RemoveKeyboardHook;
end;

------------------------------------

Интересно, что функция SendMessage(ProgHandle, WM_MES, ParamW, Code); вроде как выполняется, но вызова
Procedure TForm1.WMMes(var Message: TMessage); почему то не происходит!

И ещё странно, когда в Far"e нажимаю кнопки, то тоже всё нормально перехватывается (как и в самом моём приложении), в других же программах нет.


 
Digitman   (2003-12-19 09:33) [1]


> в других же программах нет


если под "другими программами" подразумеваются консольные приложения, ДОС-задачи и NT-службы, то так и должно быть


 
Amadeus   (2003-12-19 13:02) [2]

>если под "другими программами" подразумеваются консольные >приложения, ДОС-задачи и NT-службы, то так и должно быть

Нет, самые обычные win32 приложения: проводник, word, internet explorer, блокнот и т.д.


 
Digitman   (2003-12-19 14:31) [3]

у тебя есть серьезная ошибка : переменная ProgHandle во всех создаваемых экз-рах HookDLL (кроме самого первого) равна нулю.

Эту переменную нужно делать глобально-уникальной

См. примеры в статьях на этом сайте в части CreateFileMapping() и MapViewOfFile()


 
Amadeus   (2003-12-20 03:05) [4]

Спасибо, всё сделал, всё работает.
Только что я обнаружил. Когда компилирую этот код (или примеры с этого сайта) на Delphi 7, то в процессе работы постоянно выдаётся какая то ошибка памяти. В Delphi 5 всё нормально. Кто-нибудь с этим сталкивался?


 
Digitman   (2003-12-20 11:31) [5]


> постоянно выдаётся какая то ошибка памяти


а голова и отладчик для чего существуют по-твоему ?)



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.028 c
7-80316
SlyFox
2003-12-05 08:17
2004.02.25
Запись CD (нужна VCL)!!!


14-80149
Мыслитель
2004-01-30 18:21
2004.02.25
Бойцовский Клуб!


8-80040
Андрей Сенченко
2003-10-21 12:56
2004.02.25
Чтение тэгов MP3


1-79835
novi
2004-02-10 20:27
2004.02.25
Компонент OpenDialog


1-79739
Oleg_
2004-02-11 16:45
2004.02.25
Ошибка открытия файла через TFileStream





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский