キーボード アクションを偽造する通常の方法 (SendInput/SendKeys/etc) をすべて試しましたが、DirectInput を使用するゲームではいずれも機能しないようでした。多くの読書と検索の後、デバイスに接続できる C++ ライブラリであるInterceptionに出くわしました。
C++ (C# には何も存在しませんでした) を使用して以来、非常に長い時間が経過しているため、これで問題が発生しています。以下にサンプルコードを貼り付けました。
これを使用してコードから重要なアクションを開始する方法があるように見えますか? サンプルはすべて、デバイスにフックしてアクションを書き換えるだけです (x キーで y を出力、マウス軸を反転するなど)。
enum ScanCode
{
SCANCODE_X = 0x2D,
SCANCODE_Y = 0x15,
SCANCODE_ESC = 0x01
};
int main()
{
InterceptionContext context;
InterceptionDevice device;
InterceptionKeyStroke stroke;
raise_process_priority();
context = interception_create_context();
interception_set_filter(context, interception_is_keyboard, INTERCEPTION_FILTER_KEY_DOWN | INTERCEPTION_FILTER_KEY_UP);
/*
for (int i = 0; i < 10; i++)
{
Sleep(1000);
stroke.code = SCANCODE_Y;
interception_send(context, device, (const InterceptionStroke *)&stroke, 1);
}
*/
while(interception_receive(context, device = interception_wait(context), (InterceptionStroke *)&stroke, 1) > 0)
{
if(stroke.code == SCANCODE_X) stroke.code = SCANCODE_Y;
interception_send(context, device, (const InterceptionStroke *)&stroke, 1);
if(stroke.code == SCANCODE_ESC) break;
}
コメントアウトしたコードは、私が試したもののうまくいかなかったものです。