IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> Вопрос про Hook
Unconnected
сообщение 7.03.2010 23:38
Сообщение #1


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Привет всем.

Имеется хук на клавиатуру, заданный так:

{$J+}
const
Hook11: HHook = 0;
WH_KEYBOARD_LLL = 13;
{$J-}

function HookProct2(nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall;
begin
Result:=-1;
end;

procedure DisableKBtt; stdcall;
begin
if Hook11 = 0 then Hook11:=SetWindowsHookEx(WH_KEYBOARD_LLL,@HookProct2,HInstance,0);
end;

procedure EnableKBtt; stdcall;
begin
UnhookWindowsHookEx(Hook11);
Hook11:=0;
end;


Требуется пропускать лишь цифры. Прочитал немного про этот метод - так понял, что через HookProct2 и проходят все нажатия-сообщения, и у меня эта процедура присваивает всем нажатиям -1, и клавиатура считай отключается. Чтобы пропускать лишь цифры, нужно как-то различать сообщения. Я смотрел входные параметры при разных нажатиях - nCode всегда=0, WParam=256, Data - каждый раз другое число, закономерностей я не заметил, на ASCII-коды не похоже. Или, может, всё это дело нужно в библиотеку запихнуть?


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 8.03.2010 17:16
Сообщение #2


Гость






Сорри, это я ошибся. Надо не к PMsg приводить, там (в случае WH_KEYBOARD_LL) указатель на другую структуру будет. Вот так:

function HookProct2(nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall;
type
tagKBDLLHOOKSTRUCT = record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: DWORD;
end;
TKbDllHookStruct = tagKBDLLHOOKSTRUCT;
PKbDllHookStruct = ^TKbDllHookStruct;

var
mymsg: PKBDLLHOOKSTRUCT;
begin
Result := -1;
if nCode = HC_ACTION then
begin
myMsg := PKBDLLHOOKSTRUCT(Data);

// НЕ Цифровые? Отсечь (вернуть -1). Заметь, проверяем отдельно верхний ряд,
// отдельно - цифровую клавиатуру, ибо для них сканкоды - разные
if not (myMsg.vkCode in [48 .. 57, VK_NUMPAD0 .. VK_NUMPAD9]) then Exit;

end;
// В любом другом случае вернуть результат CallNextHookEx, как требует MSDN...
result := CallNextHookEx(0, nCode, MsgID, Data);
end;
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 13.07.2025 15:02
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"