Windows Keyhook сообщает обо всем дважды - PullRequest
5 голосов
/ 23 марта 2012

Я использую 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;

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

1 Ответ

16 голосов
/ 23 марта 2012

В вашем KeyboardHookProc вам нужно проверить старший бит аргумента LongParam . Если старший бит равен нулю, это нажатие клавиши. Если старший бит равен единице, то это выпуск ключа.

Например:

KeyUp:boolean;

KeyUp := ((LongParam and (1 shl 31)) <> 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...