5

次の標準の GenerateKey Code を使用しています。

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 などのゲームで試してみると、機能しません。この動作の考えられる理由はありますか?

4

1 に答える 1

3

あなたのゲームはおそらく下位レベルで動作する DirectInput を使用するため、SendInput() を使用してイベントを注入することはできません。必要なことを行うには、キーボードフィルター ドライバーが必要になる場合があります。私は簡単なグーグルをしましたが、明確なものは何も思いつきませんでしたが、これがあなたがどちらの道を行く必要があるかについてのアイデアを与えることを願っています.

目的に合わせて変更できる WDK (Windows Driver Kit) には、キーボード フィルター ドライバーのサンプルが含まれているはずです。かなり絡んだでしょう。

于 2011-04-23T04:28:25.703 に答える