Помощь - Поиск - Пользователи - Календарь
Полная версия: Вопрос про Hook
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Unconnected
Привет всем.

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

{$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-коды не похоже. Или, может, всё это дело нужно в библиотеку запихнуть?
volvo
Цитата
Прочитал немного про этот метод - так понял, что через HookProct2 и проходят все нажатия-сообщения, и у меня эта процедура присваивает всем нажатиям -1, и клавиатура считай отключается. Чтобы пропускать лишь цифры, нужно как-то различать сообщения.
Если б ты внимательно читал MSDN, то заметил бы, что
Цитата
The lParam parameter to the filter function contains a pointer to an EVENTMSG structure.
, то есть:

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;
Unconnected
Мм а дальше его как пропускать? Я попробовал так:

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;


И нифига..
volvo
Сорри, это я ошибся. Надо не к 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;
Unconnected
Спасибо, работает как надо smile.gif Знание английского - сила)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.