Перехватите клавиатуру из внедренной DLL с помощью KeyboardProc / SetWindowsHookEx

Примечание. Я работаю на простом C. Не на C++, не на C#.

Я работаю над модом. Я уже написал работающий DLL-инжектор, а также DLL для инжекта. Все идет хорошо, кроме пользовательского ввода.

Я хочу иметь возможность использовать горячие клавиши, поэтому я попытался настроить клавиатурный хук с помощью SetWindowsHookEx. Ниже приведена моя функция обратного вызова:

LRESULT CALLBACK keyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
{
    printf("key touched\n");
    if (wParam == VK_F5)
    {
        keyEvent = VK_F5;
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

И вот как я это настроил:

HHOOK kbHookHandle = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)keyboardHook, NULL, GetCurrentThreadId());

if (kbHookHandle != NULL)
{
    printf("keyboard hook successful!\n");
}
else
{
    printf("keyboard hook failed!\n");
}

Насколько я могу судить, хук хорошо настраивается (раньше у меня была проблема с недопустимым параметром, но я исправил ее с помощью GetCurrentThreadID). Он возвращает дескриптор, который не равен NULL.

Но всякий раз, когда я нажимаю клавишу, выхода нет.

Для дальнейшего уточнения: приведенный выше код взят из внедренной DLL. Таким образом, он фактически «принадлежит» игровому процессу. Я выделил консоль с помощью AllocConsole для печати отладочных сообщений.

Что я делаю неправильно?

РЕДАКТИРОВАТЬ: Чтобы уточнить (даже больше): указанный код взят из внедренной DLL. Это не тот подход, который я использую для внедрения DLL - я написал отдельную (работающую!) программу именно для этого.

Некоторых удивляет, что я использую printf(), так как она не появится, учитывая, что я вызываю ее из хост-процесса. Да, я вызываю его из хост-процесса, но это не проблема, потому что я уже выделил работающую консоль. Я использовал подход, очень похожий на упомянутый здесь

РЕДАКТИРОВАТЬ2: я не спрашиваю, почему printf() не работает (потому что это так), я спрашиваю, почему этот клавиатурный хук не работает.


person thaCURSEDpie    schedule 04.03.2011    source источник
comment
Вы перенаправили стандартный вывод? Что, если вы сделаете printf после AllocConsole?   -  person tibur    schedule 04.03.2011
comment
Ага. Printf() работает как надо, отображаются все мои сообщения, кроме тестового сообщения в обратном вызове   -  person thaCURSEDpie    schedule 04.03.2011
comment
Работает ли ваш код перехвата клавиатуры при использовании вне внедренной dll, например, в отдельной программе?   -  person Null Set    schedule 05.03.2011
comment
Вам нужна глобальная горячая клавиша или только та, которая работает, если текущий поток получает ввод?   -  person CodesInChaos    schedule 05.03.2011
comment
@Null Set Хороший вопрос, я еще не пробовал. Попробую. @CodeInChaos Подойдет любой способ. Пользователь будет в игре, когда будет использовать мой мод, так что это не имеет большого значения.   -  person thaCURSEDpie    schedule 05.03.2011


Ответы (1)


Вот как я определяю нажатую и нажатую клавишу в моем NoQuake Минимизатор игр ID Tech. Надеюсь, поможет.

person foxx1337    schedule 08.06.2011