Крючок клавиатуры в Windows DLL не получает сообщение о включении - PullRequest
1 голос
/ 08 декабря 2011

В нативной DLL-библиотеке Windows, работающей внутри приложения, я установил хук клавиатуры со следующей процедурой обратного вызова:

LRESULT CALLBACK onKeyHookEvent_(int code, WPARAM keyCode, LPARAM keyFlags)
{
    if (code < 0)
        return CallNextHookEx(NULL, code, keyCode, keyFlags);

    if (keyFlags & KF_UP)
        doSomething();

    return 0;
}

Но процедура никогда не получает keyFlags с установленными битами KF_UP,Я боюсь, что основное приложение каким-то образом «проглатывает» события релиза до того, как они попадают в мою ловушку.

Что еще я должен сделать, чтобы сделать хук клавиатуры чувствительным к отпусканию клавиш?

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Похоже, что маска KF_UP должна быть сдвинута в верхнюю позицию 32-битного слова.Правильный код:

static const long keyUpMask = static_cast<long>(KF_UP) << 16;

...

if (keyFlags & keyUpMask)
    doSomething();

Странно то, что я не вижу упоминания об этом в документации MSDN по обратным вызовам KeyboardProc.

0 голосов
/ 08 декабря 2011

Вы можете попробовать использовать клавиатуру низкого уровня ( Low Level KeyboardProc MSDN ).Вы сможете обрабатывать сообщения WM_KEYUP и WM_SYSKEYUP.Но я не знаю, ищете ли вы что-то подобное или что-то еще.Я использовал это однажды с программой кейлоггер в сборке, и она отлично работала для нажатий клавиш и релизов.

...