Как имитировать нажатие клавиши в C

#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 вечера