Форум: "WinAPI";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
ВнизHOOK на клавиатуру. Интересное свойство. Найти похожие ветки
← →
Doctor Deejay (2002-05-17 10:39) [0]Установил хук на клавиатуру, а оно на каждое нажатие клавиши выводит указанный символ два раза.
Не очень разбираюсь в ловушках, поэтому прошу помочь.
Ставлю ловушку из DLL:
function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
AppWnd: HWND; // дескриптор приложения, в котором произошло нажатие клавиши
begin
if code < 0 then
begin
Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
Exit;
end;
if ( ((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(GlobalData^.MyAppWnd, WM_MYKEYHOOK, wParam, AppWnd);
end;
CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
Result:= 0;
end;
{Процедура установки HOOK-а}
procedure hook(switch : Boolean; hMainProg: HWND) export; stdcall;
begin
if switch=true then
begin
{Устанавливаю HOOK, если он не установлен }
GlobalData^.SysHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, HInstance, 0);
GlobalData^.MyAppWnd:= hMainProg;
if GlobalData^.SysHook <> 0 then
MessageBox(0, "KEYBOARD HOOK установлен !", "Message from keyhook.dll", 0)
else
MessageBox(0, "HOOK установить не удалось !", "Message from keyhook.dll", 0);
end
else
begin
{Удаляю функцию-фильтр, если она установлена}
if UnhookWindowsHookEx(GlobalData^.SysHook) then
MessageBox(0, "HOOK снят !", "Message from keyhook.dll", 0)
else
MessageBox(0, "HOOK снять не удалось !", "Message from keyhook.dll", 0);
end;
end;
Затем вызываю из своей программы:
procedure TForm1.Button1Click(Sender: TObject);
var
Hook: procedure (switch : Boolean; hMainProg: HWND) stdcall;
begin
SendMessage(Form1.Handle, WM_MYKEYHOOK, VK_SPACE, Application.MainForm.Handle);
@hook:= nil; // инициализируем переменную hook
hDLL:= LoadLibrary(PChar("keyhook.dll")); { загрузка DLL }
if hDLL > HINSTANCE_ERROR then
begin { если всё без ошибок, то }
@hook:=GetProcAddress(Hdll, "hook"); { получаем указатель на необходимую процедуру}
Button2.Enabled:=True;
Button1.Enabled:=False;
StatusBar1.SimpleText:= "Status: DLL loaded...";
hook(true, Form1.Handle);
StatusBar1.SimpleText:= "Status: loging in progress...";
end
else
begin
ShowMessage("Ошибка при загрузке DLL !");
Exit;
end;
end;
И в результате оно отбражает каждое нажатие клавиши как два.
В чем дело, не знаю, может подскажет кто?
Буду благодарен...
← →
Fellomena (2002-05-17 12:48) [1]Почему два раза - понятно. Это из-за того, что ловушка срабатывает дважды, один раз при нажатии клавиши, другой - при её отжатии.
Но почему
(lParam and KF_UP)=0
не фильтрует ситуацию, когда клавиша отжата - не понятно.
...хотя должна.
← →
Doctor Deejay (2002-05-17 14:21) [2]У меня компилятор этот 0 на nil заменил. Как этого избежать?
← →
Kozhanov (2002-05-17 14:28) [3]http://delphi.mastak.ru/download/HookDLL.zip
← →
SerVS (2002-05-17 18:18) [4]Fellomena права, причина именно в этом
Я с чего ты взял "(lParam and KF_UP)=0", мне кажется должно быть
"lParam and KF_UP <>0"
← →
Doctor Deejay (2002-05-17 22:29) [5]> Fellomena права, причина именно в этом
> Я с чего ты взял "(lParam and KF_UP)=0", мне кажется должно
> быть
> "lParam and KF_UP <>0"
НЕ РАБОТАЕТ ТАК ОНО!! ВООБЩЕ НИЧЕГО НЕ ЛОВИТ!!!!!!!!
← →
Nazareth (2002-06-02 11:03) [6]Попоробуй вместо KF_UP - $80000000
← →
Лам (2002-07-18 20:12) [7]У меня та же проблема.
← →
Юрий Зотов (2002-07-19 00:59) [8]KF_UP имеет тип word. Поэтому, если уж сравнивать его, то не со всем LParam, а с его старшим словом. А еще проще сразу проверять 31-й бит LParam - он ведь знаковый:
if LParam < 0 then ... // бит установлен.
← →
ION T (2002-07-19 14:35) [9]А на кой х.. Борланд поставил ворд для маскировки дворда?!?!
← →
Proton (2002-07-20 00:59) [10]борланд здесь вообще не причем
тебе вот эта строка
function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
ни о чем не говорит ?
← →
ION T (2002-07-20 13:07) [11]Хрена с папуасом:
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
);
Хотя, действительно, Борланд здесь ни при чем: в Winuser.h есть вот такое:
/*
* WM_KEYUP/DOWN/CHAR HIWORD(lParam) flags
*/
#define KF_EXTENDED 0x0100
#define KF_DLGMODE 0x0800
#define KF_MENUMODE 0x1000
#define KF_ALTDOWN 0x2000
#define KF_REPEAT 0x4000
#define KF_UP 0x8000
Всё равно не понятно зачем такое делать (ну хоть в МСДНе бы написали)....
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c