Борьба с SendInput () - PullRequest
       49

Борьба с SendInput ()

0 голосов
/ 21 октября 2019

Я хочу внедрить каждую возможную комбинацию четырехзначных чисел в другую программу (например, блокнот), имитируя клавиатуру, но я не могу понять, как использовать функцию SendInput () или, если естьлучшая альтернатива.

string code;
for (int digit1 = startThousand; digit1 < 10; digit1++){
    for (int digit2 = 0; digit2 < 10; digit2++){
        for (int digit3 = 0; digit3 < 10; digit3++){
            for (int digit4 = 0; digit4 < 10; digit4++){

            code = (std::to_string(digit1)+std::to_string(digit2)+std::to_string(digit3)+std::to_string(digit4));
                    //generating the 4 digit codes and outputting the final code into a single variable
            cout << code << "\n";
                    //printing the code
            SendInput(code, ???, sizeof(code))
                    //sending the code into a different program

}}}}

1 Ответ

1 голос
/ 21 октября 2019

SendInput не принимает в качестве параметра строку.

  Sendinput(cInputs, pInputs, cbSize);

//cInputs = number of structures in the pInputs array..
//pInputs = a pointer to a INPUT structure which contains info about your mouse/key event. 
//cbSize  = the size of the structure. Tip! use sizeof();
//Step 1.
//Declare a KEYBDINPUT struct and set appropriate values to each variable.
//See MSDN...
//
//Step 2.
//Declare a INPUT structure.
//Set type: INPUT_KEYBOARD. then set "yourinputstruct".ki equal to your keybdinput struct
//
//Step 3:
//Use Sendinput function! Sendinput(1,&yourinputstruct, sizeof(yourinutstruct));

Список виртуальных кодов ключей см. В MSDN. https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes

Вот функция, которую я написал, она все еще может нуждаться в некоторых улучшениях, но я думаю, что она сделает то, что вы просите! по крайней мере, это работает для меня, набирая cmd и блокнот ... Читайте msdn или попросите меня прокомментировать, если это трудно понять!

Просто передайте виртуальный код ключа в качестве первого параметра и true, если онэто расширенный ключ и false, если это не так!

void KeyPress(unsigned short VK, bool ExtendedKey)
{
    KEYBDINPUT  KeyDown = { 0 };
    KEYBDINPUT  KeyUp = { 0 };
    INPUT Input[2] = { 0 };

    //KeyDown...
    KeyDown.wVk = VK;
    KeyDown.wScan = 0;
    KeyDown.time = 10;
    KeyDown.dwFlags = 0;
    KeyDown.dwExtraInfo = 0;

    if (ExtendedKey == true)
    {
        KeyDown.wVk = VK;
        KeyDown.wScan = 0;
        KeyDown.time = 1000;
        KeyDown.dwFlags = KEYEVENTF_EXTENDEDKEY;
        KeyDown.dwExtraInfo = 0;
    }

    //KeyUp...
    KeyUp.wVk = VK;
    KeyUp.wScan = 0;
    KeyUp.time = 10;
    KeyUp.dwFlags = KEYEVENTF_KEYUP;
    KeyUp.dwExtraInfo = 0;

    if (ExtendedKey == true)
    {
        KeyUp.wVk = VK;
        KeyUp.wScan = 0;
        KeyUp.time = 10;
        KeyUp.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP;
        KeyUp.dwExtraInfo = 0;
    }
    //Setup Input...
    Input[0].type = INPUT_KEYBOARD;
    Input[0].ki = KeyDown;

    Input[1].type = INPUT_KEYBOARD;
    Input[1].ki = KeyUp;

    //Click and Release!
    SendInput(1, &Input[0], sizeof(Input[0]));
    SendInput(1, &Input[1], sizeof(Input[1]));
}
...