SendInput не работает для игр - PullRequest
3 голосов
/ 23 апреля 2011

Я использую следующий стандартный код 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,&Input,sizeof(Input));

  // generate up 
  ::ZeroMemory(&kb,sizeof(KEYBDINPUT));
  ::ZeroMemory(&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,&Input,sizeof(Input));
}

Я вызываю эту функцию для имитации клавиш со стрелками (вверх, вниз, влево, вправо).Тем не менее, это работает в обычном окне проводника и небольших флеш играх.Однако, когда я пробую это в играх типа Need for Speed ​​или Roadrash, это не работает .. Какие-нибудь возможные причины для такого поведения?

1 Ответ

1 голос
/ 23 апреля 2011

В ваших играх, скорее всего, используется DirectInput, который работает на более низком уровне, поэтому вы не можете вводить в него события с помощью SendInput ().Клавиатура драйвер фильтра может потребоваться, чтобы делать то, что вы хотите.Я сделал быстрый поиск в Google, но не нашел ничего определенного, но я надеюсь, что это даст вам представление о том, куда вам нужно идти.

Должен быть образец драйвера фильтра клавиатуры сWDK (Windows Driver Kit), который вы можете изменить для своих целей.Это было бы довольно сложно.

...