DirectX アプリケーションにキーを送信する必要があります。DirectInput フックを除いて最も低いレベルのキー シミュレーションであると聞いたので、SendInput() を使用しようとしています。
問題は、Windows アプリケーションでのみ問題なく動作し、DirectX アプリケーションでは問題なく動作することです。解決策を探していたところ、wVk の代わりにスキャンコードを使用し、dwFlags を 0x0008 (スキャンコード) に設定する必要があることがわかりました。
private static KEYBDINPUT createKeybdInput(ushort wVK, uint flag)
{
KEYBDINPUT i = new KEYBDINPUT();
i.wVk = 0;
i.wScan = wVK;
i.time = 0;
i.dwExtraInfo = IntPtr.Zero;
i.dwFlags = flag | (uint)0x0008;
return i;
}
public void Keyboardpress()
{
INPUT[] inp = new INPUT[2];
inp[0].type = 1;
inp[0].U.ki = createKeybdInput(0x41, 0x0000);
inp[1].type = 1;
inp[1].U.ki = createKeybdInput(0x41, 0x0002);
if (SendInput(2, inp, Marshal.SizeOf(typeof(INPUT))) == 0)
{
new Exception("Error: " + Marshal.GetLastWin32Error().ToString());
}
}
「a」を最前面のウィンドウに送信する必要がありますが、directX アプリケーションはそれに反応しません。また、DirectX スキャンコード (私の場合は 'a' = 0x1E) を使用しようとしましたが、まだ変更はありません。
ただし、SendInput() で動作するはずです。ソフトウェア「Glovepie」をダウンロードして、このプログラムがゲームのキーをシミュレートできるかどうかをテストしました。そうする方法があり、ライブラリにフックするとは思いません。いくつかの調査の後、SendInput() API も使用しているようです。それを機能させるために何をすべきか誰かが知っていますか?
どうもありがとうございました