Клавиатурный хук Windows сообщает обо всем дважды

Я использую Delphi и пытаюсь считывать данные со сканера штрих-кода через USB, так что это просто еще одно устройство с интерфейсом пользователя.

Я получаю цифры правильно, но каждую получаю дважды. Я предполагаю, что это ключ вниз и ключ вверх.

Я мог; кладите его с флагом и игнорируйте второе чтение, но лучше сделайте это правильно.

Мой код немного адаптирован из этой ссылки.

Могу ли я указать, что мне нужны только события key_up при назначении хука?

KBHook := SetWindowsHookEx(WH_KEYBOARD,
                           @KeyboardHookProc,
                           HInstance,
                           GetCurrentThreadId()) ;

или как-то проверить флаг в самой функции ловушки?


Обновление: я пытался закодировать его, но похоже, что я ошибся. Вот что я пробовал в начале функции ловушки

// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644984%28v=vs.85%29.aspx
if Code < 0 then  
begin
   Result := CallNextHookEx(KBHook, Code, WordParam, LongParam);
   Exit;
end;

if (((LongParam and $80000000) <> $80000000)    (* key is not being released *)
and ((LongParam and $40000000) <>  $40000000))  (* key was not previously down *) then
begin
   Result := CallNextHookEx(KBHook, Code, WordParam, LongParam);
   Exit;
end;

[Дальнейшее обновление] Пять лет спустя, и это все еще не помогает, но я считаю, что мой первоначальный дополнительный вопрос(см.) помогает.

5
задан Community 23 May 2017 в 12:33
поделиться