5

我正在使用以下标准 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));
}

我调用这个函数来模拟箭头键(上、下、左、右)。但是,这适用于普通的资源管理器窗口和小型 Flash 游戏。但是,当我在《极品飞车》或《Roadrash》之类的游戏上尝试它时,它不起作用.. 这种行为有什么可能的原因吗?

4

1 回答 1

3

您的游戏很可能使用在较低级别上工作的 DirectInput,因此您无法使用 SendInput() 向其注入事件。可能需要键盘过滤器驱动程序来执行您想要的操作。我做了快速的谷歌搜索,但没有提出任何明确的建议,但我希望这能让您了解您需要走哪条路。

应该有一个带有 WDK(Windows 驱动程序工具包)的键盘过滤器驱动程序示例,您可以根据自己的目的进行修改。这将是相当复杂的。

于 2011-04-23T04:28:25.703 回答