Текущий архив: 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.008 c