#keystroke #sendinput
#нажатие клавиши #ввод отправки
Вопрос:
Я использую следующий стандартный код GenerateKey :
void GenerateKey ( int vk , BOOL bExtended)
{
KEYBDINPUT kb={0};
INPUT Input={0};
// generate down
if ( bExtended )
kb.dwFlags = KEYEVENTF_EXTENDEDKEY;
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
::SendInput(1,amp;Input,sizeof(Input));
// generate up
::ZeroMemory(amp;kb,sizeof(KEYBDINPUT));
::ZeroMemory(amp;Input,sizeof(INPUT));
kb.dwFlags = KEYEVENTF_KEYUP;
if ( bExtended )
kb.dwFlags |= KEYEVENTF_EXTENDEDKEY;
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
::SendInput(1,amp;Input,sizeof(Input));
}
Я вызываю эту функцию для имитации клавиш со стрелками (вверх, вниз, влево, вправо). Однако это работает в обычном окне проводника и небольших флеш-играх. Однако, когда я пробую это в таких играх, как Need for Speed или Roadrash, это не работает.. Какие-либо возможные причины такого поведения?
Ответ №1:
Ваши игры, скорее всего, используют DirectInput, который работает на более низком уровне, поэтому вы не можете вводить в него события с помощью SendInput(). Для выполнения того, что вы хотите, может потребоваться драйвер фильтра клавиатуры. Я быстро погуглил, но не нашел ничего определенного, но я надеюсь, что это даст вам некоторое представление о том, каким путем вам нужно идти.
Должен быть образец драйвера фильтра клавиатуры с WDK (Windows Driver Kit), который вы могли бы изменить для своих целей. Это было бы довольно сложно.