0

ゲーム (Elsword) のいくつかのキーを再マップしようとしています。

まず、このコードを使用して、押されたキーをシミュレートします。

#define WINVER 0x0500

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "dinput.h"

int main()
{
    HWND hWndMain = FindWindow(0, "Elsword");
    SetForegroundWindow(hWndMain);

    Sleep(3000);

    INPUT input[2];

    input[0].type=INPUT_KEYBOARD;
    input[0].ki.wScan = DIK_V; // direct-input scancode for key '1'
    input[0].ki.dwFlags=KEYEVENTF_SCANCODE;

    input[1].type=INPUT_KEYBOARD;
    input[1].ki.wScan = DIK_V; // direct-input scancode for key '1'
    input[1].ki.dwFlags=KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;

    SendInput(2,input,sizeof(INPUT));

    Sleep(1000);
    return 0;
}

他のすべてのアプリケーションでは問題なく動作しますが、ゲーム ウィンドウでは何もしません...

4

1 に答える 1

1

Direct3D をフックすると、グラフィックス関連の機能にのみアクセスできるようになり、入力関連の機能にはアクセスできないことに注意してください。Direct3D を使用するゲームをフックするには、DirectInput をフックする (ゲームで使用する場合) か、SentInput または PostMessage を使用する必要があります。最近のほとんどのゲームは、マウスに標準の Windows メッセージを使用し、DirectInput または独自のカスタム キーボード実装を使用します。また、SendInput API はシステム全体であり、適切なターゲット ウィンドウにフォーカスを合わせる必要があることにも注意してください。また、一部のゲームでは、D3D ウィンドウのクライアント領域上に非表示のレイヤーとして機能する追加のウィンドウが作成されるため、入力メッセージを送信するのに適切なウィンドウ ハンドルについて混乱が生じます。

ゲームが入力に Windows メッセージを使用しているかどうかを確認するには、Spy++ を開き、ウィンドウ モードでゲームを実行します。[プロセス] ボタンをクリックし、ゲームのプロセスを右クリックして [メッセージ] を選択します。次に、[ログ オプション] ボタンをクリックし、[メッセージ] タブに切り替えます。ここから、「キーボード」と「マウス」を選択するか、CTRL キーを押したままにして、リストから個々のメッセージを選択/選択解除できます。その後、[OK] をクリックして、ターゲット アプリケーションでキーボードとマウスをテストします。マウス関連のメッセージが表示された場合は、SendInput、PostMessage、SetWindowsHookEx、およびおそらく mouse_event() がマウスで機能することがわかります。キーボード関連のメッセージが表示された場合は、SendInput、PostMessage、SetWindowsHookEx、およびおそらく keyb_event() がキーボードで機能することがわかります。

キーボードのメッセージが表示されない場合、最も可能性の高いアクションは、プロセスが dinput.dll または dinput8.dll をロードしたかどうかを確認し、ロードしている場合はフックをインストールすることです (google "directinput hooking")。 . そうでない場合は、Dependency Walker、IDA、または OllyDbg でロードされた各モジュールをチェックして、それらが独自のキーボード ハンドラーを実装しているかどうかを確認できますが、この時点でかなり複雑になり、かなりの ASM の知識が必要になります。そしてリバースエンジニアリング技術。ただし、ドライバーの開発に精通している場合は、これが役立つ場合があります。SendInput ゲームで機能しない

于 2013-01-27T22:10:35.270 に答える