Примечание. Я работаю на простом 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() не работает (потому что это так), я спрашиваю, почему этот клавиатурный хук не работает.