Ввод отправки не работает для игр

#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), который вы могли бы изменить для своих целей. Это было бы довольно сложно.