Форум: "Система";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
Внизне могу поставить ловушку Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.012 c