Вы можете использовать SendInput () для отправки кодов аппаратного сканирования (в отличие от виртуальных кодов сканирования, которые DirectInput может игнорировать). Он плохо документирован, но SendInput () действительно может обходить DirectInput. Причина, по которой решение Эрика не срабатывало, - это установить код сканирования аппаратного обеспечения, но в итоге он использовал код виртуального сканирования (установив dwFlags в 0 и wVk на ненулевой).
По существу, чтобы сделать нажмите клавишу, которую вы хотите установить:
ip.ki.dwFlags = KEYEVENTF_SCANCODE;
И чтобы сделать выпуск ключа, установите:
ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
Ниже приведен полный рабочий образец, и он печатает букву 'a' , Вы можете найти другие коды сканирования здесь .
#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;
}
Примечание. Вы можете комбинировать нажатия клавиш (например, shift + a для A), передавая SendInput () массив структур INPUT ,