Примечание: я работаю на простом 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 (), так как это не будет отображаться,учитывая, что я называю это изнутри хост-процесса. Да , я вызываю его изнутри хост-процесса, но это не проблема, потому что я уже выделил рабочую консоль.Я использовал подход, очень похожий на упомянутый здесь
EDIT2: Я не спрашиваю, почему printf () не работает (потому что он есть), я спрашиваю, почему этот клавишный крюк нене работает.