#c #macros #keyboard #bots #sendinput
#c #макросы #клавиатура #боты #отправка ввода
Вопрос:
Позвольте мне быть немного более конкретным..
Я пытаюсь имитировать движение вперед в игровом макроботе, над которым я работаю…
Эта игра запускается через мой браузер Chrome. Мне нужен этот код, чтобы выполнить это, чтобы произвести «wwwwwwwwwwwwww» в блокноте или что-то из-за ключа проходит вниз.
Насколько мне известно, это НЕ ошибка совместимости, а логическая ошибка…
Вот простой пример моего дорожного блока:
#include <windows.h>
void keyPress(WORD keyCode)
{
INPUT input;
input.type = INPUT_KEYBOARD;
input.ki.wVk = keyCode;
input.ki.dwFlags = 0;
SendInput(1, amp;input, sizeof(input)); // Press key?
Sleep(3000); // Key suppose to be held for 3 seconds but isnt??
input.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, amp;input, sizeof(input)); // Release key?
}
int main()
{
keyPress(0x57); // 0x57 = W key code
return 0;
}
SendInput() казалась функцией, используемой для моделирования нажатия клавиш, но если я должен использовать что-то другое, пожалуйста, поделитесь!
Спасибо.
Комментарии:
1. Убедитесь, что вы добавили проверку ошибок, если ваш реальный код этого еще не делает. Также вероятно, что вам не нужна глобальная функция ввода, когда вы работаете с одним конкретным приложением.
2. @chris Есть какие-либо предложения по устранению неполадок? Честно говоря, расстраивает, что это так сложно для c , например, если бы я переключился на java, я бы закончил за 10 минут
3. Проверьте возвращаемые значения функций API в соответствии с документацией этих функций. Вам не нужно угадывать, при каком вызове происходит сбой, если таковой имеется, или почему.
Ответ №1:
РЕШЕНИЕ: Хорошо, благодаря дальнейшему опыту с этим, похоже, проблема с моим исходным кодом заключалась в отсутствии KEYEVENTF_SCANCODE в моих dwFlags. Похоже, существует базовая взаимосвязь, для которой требуется флаг KEYEVENTF_SCANCODE, чтобы удерживать клавишу со стрелкой, по крайней мере, в Chrome, возможно, в масштабах всей системы. Итак, вот простое решение:
#include <windows.h>
void keyPress(WORD keyCode)
{
INPUT input;
input.type = INPUT_KEYBOARD;
input.ki.wScan = keyCode;
input.ki.dwFlags = KEYEVENTF_SCANCODE;
SendInput(1, amp;input, sizeof(INPUT));
}
void keyRelease(WORD keyCode)
{
INPUT input;
input.type = INPUT_KEYBOARD;
input.ki.wScan = keyCode;
input.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
SendInput(1, amp;input, sizeof(INPUT));
}
int main()
{
Sleep(5000); // pause time to open browser tab
keyPress(0x24); // press key
Sleep(1000); // hold key for x milliseconds
keyRelease(0x24); // release key
return 0;
}
Я в замешательстве, почему коды сканирования не совпадают с теми, которые предоставлены Microsoft («0x25» — это стрелка вниз вместо «0x28»?), Так что, если кто-то получил некоторое представление об этом, это было бы здорово.
РЕДАКТИРОВАНИЕ РЕШЕНИЯ: причина, по которой мои коды клавиш не выстраивались в очередь, заключалась в том, что мне нужно использовать scancodes. Мне немного повезло в том, что игра, в которую я играю, также использует IJKL в качестве клавиш со стрелками, поэтому казалось, что коды были отключены на несколько цифр, когда на самом деле он все время нажимал буквенные клавиши. Итак, в основном все, что мне нужно сделать, это использовать эти коды сканирования для перемещения: 0x17 =»I» 0x24 =»J» 0x25 =»K» 0x26 = «L»
Я надеюсь, что это поможет кому-то, кто так же потерян, как и я (:
кроме того, профессиональный совет, кодируйте макроботов на python, это гораздо меньше головной боли. Я отказался от своего кода на c и запустил свой код на python за 2 вечера