SendInput в C или C ++ не имитирует клавиатуру точно, есть ли лучшая функция для этого? [Дубликат]

5
задан IInspectable 6 September 2013 в 00:29
поделиться

3 ответа

Вы можете использовать SendInput () для отправки кодов аппаратного сканирования (в отличие от виртуальных кодов сканирования, которые DirectInput может игнорировать). Он плохо документирован, но SendInput () действительно может обходить DirectInput. Причина, по которой решение Эрика не срабатывало, - это установить код сканирования аппаратного обеспечения, но в итоге он использовал код виртуального сканирования (установив dwFlags в 0 и wVk на ненулевой).

По существу, чтобы сделать нажмите клавишу, которую вы хотите установить:

ip.ki.dwFlags = KEYEVENTF_SCANCODE;

И чтобы сделать выпуск ключа, установите:

ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;

Ниже приведен полный рабочий образец, и он печатает букву 'a' , Вы можете найти другие коды сканирования здесь .

#define WINVER 0x0500
#include <windows.h>

using namespace std;

int main()
{

    //Structure for the keyboard event
    INPUT ip;

    Sleep(5000);

    //Set up the INPUT structure
    ip.type = INPUT_KEYBOARD;
    ip.ki.time = 0;
    ip.ki.wVk = 0; //We're doing scan codes instead
    ip.ki.dwExtraInfo = 0;

    //This let's you do a hardware scan instead of a virtual keypress
    ip.ki.dwFlags = KEYEVENTF_SCANCODE;
    ip.ki.wScan = 0x1E;  //Set a unicode character to use (A)

    //Send the press
    SendInput(1, &ip, sizeof(INPUT));

    //Prepare a keyup event
    ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
    SendInput(1, &ip, sizeof(INPUT));



    return 0;
}

Примечание. Вы можете комбинировать нажатия клавиш (например, shift + a для A), передавая SendInput () массив структур INPUT ,

18
ответ дан David 23 August 2018 в 16:10
поделиться

Вам часто нужно установить код проверки:

// Set up a generic keyboard event.
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = MapVirtualKey(code, MAPVK_VK_TO_VSC); // hardware scan code for key
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;

// Press the "..." key
ip.ki.wVk = code; // virtual-key code for the "a" key
ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));

И создание массива по предложению IInspectable также является определенным способом.

4
ответ дан Eric Brown 23 August 2018 в 16:10
поделиться

Если вы хотите создать игрового бота, посмотрели ли вы на программу AutoHotKey? http://www.autohotkey.com/

Он предлагает язык сценариев, который позволяет выполнять множество задач, связанных с созданием «бота», и это довольно просто чем пытаться сделать все это на C ++

(Это, безусловно, играло в Farmville для меня, когда вся моя семья давила на создание учетной записи)

1
ответ дан Strings 23 August 2018 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: