SendInput () no es igual a presionar la tecla manualmente en el teclado en C ++?

Quería escribir un código de C ++ para emular presionando una tecla del teclado “A”:

// Set up a generic keyboard event. ip.type = INPUT_KEYBOARD; ip.ki.wScan = 0; // 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)); // Release the "..." key ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release SendInput(1, &ip, sizeof(INPUT)); 

Funciona bien cuando inicio otro progtwig y espero a que mi progtwig se ejecute, se hace clic en “A” y el primer progtwig reactjs. Pero encontré que en la otra aplicación, mi acción de alguna manera se previno (puedo presionar “A” manualmente en el teclado, pero usar mi progtwig no causa ninguna acción).

Entonces, ¿qué puedo hacer para presionar “A” desde el progtwig más idéntico al “A” presionado manualmente (para que el segundo progtwig no reconozca que fue llamado desde el progtwig)?

No tengo el código fuente del segundo progtwig y no sé cómo reconoce que “A” no se presionó manualmente.

Estoy seguro de que la ventana en la que quiero reactjsr a mi código es de primer plano, recibir y bloquear mi clave (para que pueda decidir que el evento no proviene del usuario sino del progtwig).

También puede usar SendInput () para enviar códigos de exploración de hardware (a diferencia de los códigos de exploración virtual, que DirectInput podría ignorar). Está poco documentado, pero SendInput () puede pasar por alto DirectInput. La razón por la cual la solución de Eric no funcionó es que configuró el código de escaneo de hardware, pero terminó usando un código de escaneo virtual (estableciendo dwFlags a 0 y wVk a no cero).

Básicamente, para hacer una pulsación de tecla, quiere establecer:

 ip.ki.dwFlags = KEYEVENTF_SCANCODE; 

Y para hacer una liberación de tecla, establece:

 ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; 

Una muestra de trabajo completa está debajo e imprime la letra ‘a’. Puede encontrar otros códigos de escaneo aquí .

 #define WINVER 0x0500 #include  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; } 

Nota: Puede combinar pulsaciones de teclas (como, cambiar + a para A) pasando SendInput () una matriz de estructuras de ENTRADA.

A menudo necesitas configurar el código de escaneo:

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

Y construir una matriz como lo sugiere IInspectable es también definitivamente el camino a seguir.

Si está buscando crear un juego bot, ¿ha mirado el progtwig AutoHotKey? http://www.autohotkey.com/

Ofrece un lenguaje de scripting, que le permite realizar muchas de las tareas involucradas en la creación de ‘bot’ y es más fácil que tratar de hacerlo todo en C ++

(Ciertamente jugó Farmville para mí, cuando toda mi familia me presionó para que creara una cuenta)