SendInput() not equal to pressing key manually on keyboard in C++?

前端 未结 3 1632
时光取名叫无心
时光取名叫无心 2020-11-28 08:55

I wanted to write a c++ code to emulate pressing a keyboard key \"A\":

// Set up a generic keyboard event.
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0; // hard         


        
相关标签:
3条回答
  • 2020-11-28 09:26

    You often need to set the scan code:

    // 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));
    

    And building an array as IInspectable suggests is also definitely the way to go.

    0 讨论(0)
  • 2020-11-28 09:28

    If you are looking to create a game bot, have you looked at the program AutoHotKey? http://www.autohotkey.com/

    It offers a scripting language, that allows you to do a lot of the tasks involved in 'bot' creation and it's rather easier than trying to do it all in C++

    (It certainly played Farmville for me, when all my family pressured me into creating an account)

    0 讨论(0)
  • 2020-11-28 09:41

    You can use SendInput() to send hardware scan codes as well (as opposed to virtual scan codes, which DirectInput might ignore). It's poorly documented, but SendInput() can indeed bypass DirectInput. The reason Eric's solution didn't work is he set the hardware scan code, but ended up using a virtual scan code (by setting dwFlags to 0 and wVk to non-zero).

    Essentially, to do a key press you want to set:

    ip.ki.dwFlags = KEYEVENTF_SCANCODE;
    

    And to do a key release, set:

    ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
    

    A full working sample is below and it prints the letter 'a'. You can find other scan codes here.

    #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;
    }
    

    Note: You can combine keypresses (like, shift + a for A) by passing SendInput() an array of INPUT structures.

    0 讨论(0)
提交回复
热议问题