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

Вниз

не могу поставить ловушку   Найти похожие ветки 

 
dolphin1   (2003-10-26 11:32) [0]

Ниже представлен код DLL
в котором я пытаюсь поставить ловушку на клаву
но под 2000,ХР не хера не работает
то есть работает но через 2-3 секунды падеют все приложения
а в оффисе(ворд) вообще нажатие клавиши обрабатывается 6 раз
не могу понять что делать

покажите пример ловушки реально работающей под 2000,ХР
К стати пример взят из Королевсева Дельфи ( прибил бы того гада что ставит такие примеры в сокровищницу. Второй день не могу поставить ловушку )

library hook;

uses
SysUtils,
Windows,
Messages,
dIALOGS,
Forms;

{$R *.res}

var
WM_MYKEYHOOK: Cardinal;
appsh : THandle;
HookHandle: HWND;

function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
AppWnd: HWND; // дескриптор приложения, в котором произошло нажатие клавишы
begin
if code < 0 then
begin
Result:= CallNextHookEx(HookHandle, Code, wParam, lParam);
Exit;
end;

if (((lParam shr 31)=1) and ((lParam and KF_UP)=0) and (wParam>=65) and (wParam<=90) ) OR ( ((lParam and KF_UP)=0) and (wParam=VK_SPACE) ) then
begin
AppWnd:= GetForegroundWindow();
SendMessage(appsh, WM_MYKEYHOOK, wParam, AppWnd);
{можно и так, что бы не сохранять дескриптор главного приложения}
end;
Result:=CallNextHookEx(HookHandle, Code, wParam, lParam);
end;

{Процедура установки HOOK-а}
procedure hookapp(switch : Boolean; hMainProg: HWND) export; stdcall;
begin
if switch=true then
begin
{Устанавливаю HOOK, если он не установлен (switch=true). }
HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, HInstance, 0);
appsh := hMainProg;
end
else
begin
{Удаляю функцию-фильтр, если она установлена (т.е. switch=false). }
if UnhookWindowsHookEx(HookHandle) then
MessageBox(0, "HOOK снят !", "Message from keyhook.dll", 0)
else
MessageBox(0, "HOOK снять не удалось !", "Message from keyhook.dll", 0);
HookHandle:=0;
end;
end;

exports hookapp NAME "hookapp";

begin
end.


 
Digitman ©   (2003-10-26 12:28) [1]

значение переменной HookHandle во всех экземплярах хук-DLL, внедряемых автоматически при установке ловушки во все процессы, неопределено.. вот и "падает" все

приложение, вызывающее hookapp и устанавливающее тем самым ловушку, должно записать результат вызова SetWindowsHookEx() в глобально доступную область памяти, организуемую с пом. CreateFileMapping() и MapViewOfFile()

каждый экз-р хук-DLL при загрузке и инициализации должен получить доступ к глобально доступной памяти с пом. тех же вышеупомянутых вызовов, прочитать из нее значение хук-хэндла и сохранить его в переменную HookHandle, прежде чем в вызове CallNextHookEx() будет происходить обращение к этой переменной


 
zapped ©   (2003-10-26 20:21) [2]

глянь сюда, может поможет
http://delphi.mastak.ru/cgi-bin/forum.pl?id=1066833708&n=5


 
Andriy Tysh ©   (2003-10-28 10:47) [3]

((lParam and KF_UP)=0) не будет работать, ибо KF_UP=$80000000, а не то что в Windows.pas.
Посмотри в WinAPI-форуме, неделю назад у меня тоже была проблема схуком. Оказалось то, что я тепе написал.
Надо ((lParam and $80000000)=0)



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

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

Наверх




Память: 0.47 MB
Время: 0.026 c
14-25583
Вася Добрый
2003-12-17 10:52
2004.01.09
IBExpert+Firebird


1-25373
Indy
2003-12-25 04:45
2004.01.09
Документация по Indy


1-25310
ximka
2003-12-22 13:54
2004.01.09
отслеживание события & RegExp


1-25371
]eRoR_rrr[
2003-12-25 11:47
2004.01.09
RichEdit


1-25297
Тимохов
2003-12-16 14:20
2004.01.09
Правила вызова AddRef