Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.11;
Скачать: CL | DM;

Вниз

Пишу хук для глобального слежения за нажатыми клавищами...   Найти похожие ветки 

 
m_a_r_t   (2003-07-13 00:07) [0]

Не могу понять в чем ошибка, в коде DLL с ловушкой ошибок, как бы и нет.
Но когда хук запущен, и в каком нибудь приложении нажата клавиша то выскакивает такое
сообщение об ошибке:
Программа NOTEPAD вызвала сбой при обращении к странице памяти
в модуле <нет данных> по адресу 00de:00000013.

После чего NOTEPAD или любое другое приложетие фатально завершается.
А самое странное если клавиша была нажата в приложении откуда был вызван
хук то всё работает нормально...

Если хук снять то никаких подобных ошибок не возникает.
Привожу код DLL:


{
KeyHook
author: M_A_R_T
e-mail: m_a_r_t@mail.ru
}

library keyhook;

uses
Windows;

type
TEventProc = procedure;

PInfoKey = ^TInfoKey;
TInfoKey = packed record
AppWnd: HWND;
key: LongInt;
end;

var
SysHook:HHook;
OnKeyDown: TEventProc;
OnKeyUp: TEventProc;
InfoKey: PInfoKey;

function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin

if code < 0 then
begin
Result:= CallNextHookEx(SysHook, Code, wParam, lParam);
Exit;
end;

{ если это условие не выролняется то ошибок не возникает}
if code = HC_ACTION then
begin
InfoKey^.AppWnd:= GetForegroundWindow();
InfoKey^.key:=wParam;

if ((lParam and 30)=30) then // с помощью этого я пытался узнать
OnKeyUp // была клавиша была нажата или отпущена
else // данное условие не работает
OnKeyDown; // что написать, что это узнать
end;
CallNextHookEx(SysHook, Code, wParam, lParam);
Result:= 0;
end;

procedure hook(switch : Boolean;InfKey: PInfoKey; KeyDownProc,KeyUpProc: TEventProc) export; stdcall;
begin
if switch=true then
begin
SysHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, HInstance, 0);
OnKeyDown:=KeyDownProc;
OnKeyUp:=KeyUpProc;
InfoKey:=InfKey;
end
else
begin
( SysHook)
Не могу понять в чем ошибка, в коде DLL с ловушкой ошибок, как бы и нет.
Но когда хук запущен, и в каком нибудь приложении нажата клавиша то выскакивает такое
сообщение об ошибке:
Программа NOTEPAD вызвала сбой при обращении к странице памяти
в модуле <нет данных> по адресу 00de:00000013.

После чего NOTEPAD или любое другое приложетие фатально завершается.
А самое странное если клавиша была нажата в приложении откуда был вызван
хук то всё работает нормально...

Если хук снять то никаких подобных ошибок не возникает.
Привожу код DLL:


{
KeyHook
author: M_A_R_T
e-mail: m_a_r_t@mail.ru
}

library keyhook;

uses
Windows;

type
TEventProc = procedure;

PInfoKey = ^TInfoKey;
TInfoKey = packed record
AppWnd: HWND;
key: LongInt;
end;

var
SysHook:HHook;
OnKeyDown: TEventProc;
OnKeyUp: TEventProc;
InfoKey: PInfoKey;

function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin

if code < 0 then
begin
Result:= CallNextHookEx(SysHook, Code, wParam, lParam);
Exit;
end;

{ если это условие не выролняется то ошибок не возникает}
if code = HC_ACTION then
begin
InfoKey^.AppWnd:= GetForegroundWindow();
InfoKey^.key:=wParam;

if ((lParam and 30)=30) then // с помощью этого я пытался узнать
OnKeyUp // была клавиша была нажата или отпущена
else // данное условие не работает
OnKeyDown; // что написать, что это узнать
end;
CallNextHookEx(SysHook, Code, wParam, lParam);
Result:= 0;
end;

procedure hook(switch : Boolean;InfKey: PInfoKey; KeyDownProc,KeyUpProc: TEventProc) export; stdcall;
begin
if switch=true then
begin
SysHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, HInstance, 0);
OnKeyDown:=KeyDownProc;
OnKeyUp:=KeyUpProc;
InfoKey:=InfKey;
end
else
begin
UnhookWindowsHookEx(SysHook);
end;
end;

exports hook;

end.


Прошу не издеватся над моим вопросом, а ответить на него.


 
Spawn   (2003-07-13 06:24) [1]

Ты в hook передаешь процедуры для KeyDownProc и KeyUpProc? Передаешь их из своего приложения, поетому у тебя, помоему, и ошибка, т.к. эти процедуры находятся в адресном пространстве вызывающего приложения и не могут быть доступны в твоей ДЛЛ.


 
Song   (2003-07-13 17:35) [2]

В Result надо отдавать CallNextHookEx


 
m_a_r_t   (2003-07-14 03:23) [3]

Всем спасибо, тпереь я использу Sendmessage, место вызова процедур, и заношу CallNextHookEx в Result,
теперь всё работает...
Но меня заинересовало одно:
Как тошда вызывается WindowProc, если
ее адре который мы передали при создании окна,
находится не в адресном пространстве ДЛЛ которая
вызывает эту процедуру, или там всё не так?



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

Текущий архив: 2003.09.11;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.009 c
1-33649
_MAD_
2003-08-30 16:59
2003.09.11
TCheckBox


14-33722
sasami737
2003-08-21 17:57
2003.09.11
Как сделать критический процесс ?


6-33710
Maxim Pshevlotsky
2003-07-08 15:59
2003.09.11
Как узнать скорость передачи данных на FTP сервер????


1-33635
Andrey V.
2003-08-31 12:30
2003.09.11
You must be in ShowCheckBox mode to set to this date


9-33417
zorg
2003-03-06 22:23
2003.09.11
Ну хоть в этом разделе поиогут ?





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