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,&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, он не работает .. Возможные причины такого поведения?


person Arnold    schedule 23.04.2011    source источник


Ответы (1)


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

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

person Guy Sirton    schedule 23.04.2011