Привет всем.
Имеется хук на клавиатуру, заданный так:
{$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;
function HookProct2(nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall;
var myMsg: PMsg;
begin
if nCode = HC_ACTION then
begin
myMsg := PMsg(Data);
// а вот теперь из myMsg^ вытаскивай нажатый символ
end;
// ...
end;
Мм а дальше его как пропускать? Я попробовал так:
function HookProct2(nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall;
var mymsg:PMsg;
begin
if nCode = HC_ACTION then
begin
myMsg := PMsg(Data);
if not(char(mymsg) in ['0'..'9']) then Result:=-1 else result:=data;
end;
end;
Сорри, это я ошибся. Надо не к 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;
Спасибо, работает как надо Знание английского - сила)