1

キーボード アクションを偽造する通常の方法 (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;
    }

コメントアウトしたコードは、私が試したもののうまくいかなかったものです。

4

1 に答える 1

2

キーの押下を取得するには、UP および DOWN 状態のキー状態を微調整する必要があります。変数デバイスがinterception_waitによって返されるwhileループに注意してください。コメントアウトされたコードは、イベントを何に送信しますか?? デバイスが初期化されていません! コードを忘れて、より基本的なものを試してください。Interception_send 呼び出しのあるループ内の行を見て、その後さらに 2 つの呼び出しを行いますが、各呼び出しの前に INTERCEPTION_KEY_DOWN と INTERCEPTION_KEY_UP を使用して stroke.state を変更することを忘れないでください。これにより、ダウン イベントとアップ イベントを偽装できます。各キーボード イベントで追加のキーを取得します。

また、INTERCEPTION_FILTER_KEY_DOWN | の代わりに INTERCEPTION_FILTER_KEY_ALL を使用してみてください。INTERCEPTION_FILTER_KEY_UP。矢印キーは、Web サイトで説明されているように特別なものである場合があります。

于 2012-01-12T03:15:56.343 に答える