![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Снова про hook [D5, Win95/98]
Doctor Deejay © (2002-05-18 12:58:00)Все-таки я так и не разобрался как сделать, чтобы отлавливалось
только нажатие клавиши, а kf_up игнорировалось.
В новом примере, который мне посоветовали скачать,
ловушка вызывается методом:
Function KeyboardHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
Begin
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
SendMessage(ShareInf^.AppWndHandle, WM_USER, ParamW, Code);
End;
Result := CallNextHookEx(ShareInf^.OldHookHandle, Code, ParamW, ParamL)
End;
В приложении вызывается:
Procedure TMainForm.WMUser(var Message: TMessage);
Begin
Memo1.Lines.Add("Code: "+IntToStr(Message.WParam)+"; Char: "+Chr(Message.wParam));
End;
В результате всего этого в мемо появляется сообщение как при нажатии на клавишу
та и при ее отпускании. Так же отлавливается удержание на клавиши с повторение
символа несколько раз.
ЧТО СДЕЛАТЬ, ЧТОБЫ ФИКСИРОВАЛО ТОЛЬКО ОДИН РАЗ??????
Признаю, что ламер, но с ловушками никогда не работал.
gate A20 (2002-05-18 13:43:00) [1]попробуй такую функцию KeyboardHook:
Function KeyboardHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
Begin
If (Code IN [HC_ACTION, HC_NOREMOVE])and((ParamL and $80000000)=$80000000) Then
Begin
SendMessage(ShareInf^.AppWndHandle, WM_USER, ParamW, Code);
End;
Result := CallNextHookEx(ShareInf^.OldHookHandle, Code, ParamW, ParamL)
End;
Ддело в том, что (см. МСДН) при постановке хука типа WH_KEYBOARD ты перехватываешь не только сообщение WM_KEY_DOWN, но и WM_KEY_UP. Я как-то тоже попал в такую ситуацию, и долго дкмал - что считать нажатием кнопки - её нажатие или её отпускание? А если на кнопку положен кирпич, то всё ещё сложнее - фактически, нажатий-то много! (Пардон, не нажатий, а действий, которые этим кирпичом обусловлены - там много буковок напечаталось или ещё чего).