シミュレートされた入力をゲームに送信する必要があるゲーム関連のプログラムを構築しています (これは画面の一番上のウィンドウで、フルスクリーン モードで実行されます)。苦労の末、ようやくマウスの動き (カーソルのドラッグ) とキーボード入力が機能するようになりましたが、何らかの理由で、ゲームがシミュレートされたマウス クリックに反応しません。
私は次のことを試しました:
#if TRUE // SendInput works for keyboard simulation and mouse drag, but not clicks:
INPUT mouse = {0};
mouse.type = INPUT_MOUSE;
mouse.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
SendInput(1, &mouse, sizeof(INPUT));
Sleep(100);
ZeroMemory(&mouse, sizeof INPUT);
mouse.type = INPUT_MOUSE;
mouse.mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(1, &mouse, sizeof(INPUT));
#else // tried this, but it did not work:
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Sleep(75);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
#endif
私が直面した最初のジレンマは、一般的にメッセージを送信することでしたが、この問題はゲーム プロセスの権限 > アプリケーションの権限を送信することが原因であることに気付きました。この後、キープレスが特定のゲーム ウィンドウ/画面にしか登録されないという別の問題に遭遇しましたが、いくつかの検索の後、スキャンコードを使用してこれを克服することができました。例えば:
void SendSpacePress(bool bHardwareLevel){
INPUT space = {0};
space.type = INPUT_KEYBOARD;
space.ki.time = 0;
space.ki.dwExtraInfo = 0;
if(!bHardwareLevel){
space.ki.wVk = VK_SPACE;
}else{
space.ki.wScan = 0x39; // physical keyboard scan code
}
space.ki.dwFlags = bHardwareLevel ? KEYEVENTF_SCANCODE : 0;
SendInput(1, &space, sizeof(INPUT));
Sleep(rand()%25 + 25);
space.ki.dwFlags = bHardwareLevel ? KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP : KEYEVENTF_KEYUP;
SendInput(1, &space, sizeof(INPUT));
}
以下のように INPUT を使用してマウスの移動を行うこともできました。
void PanMouse(){
INPUT mouse = {0};
mouse.type = INPUT_MOUSE;
mouse.mi.time = 0;
mouse.mi.mouseData = 0;
mouse.mi.dwExtraInfo = 0;
mouse.mi.dwFlags = MOUSEEVENTF_MOVE;
mouse.mi.dx = rand()%10 -5;
mouse.mi.dy = rand()%10 -5;
SendInput(1, &mouse, sizeof(INPUT));
}
ここでの大きな問題は、ゲームがシミュレートされたマウス クリックの登録を拒否することです。できれば、フックに飛び込むことなくマウス入力を送信する方法が欲しいです。(ゲームには複数のクライアント側アンチチート メカニズムがあるため、あらゆる種類の外部プロセス フックまたは DLL インジェクションによって保護がトリガーされると思い込んでいます)。入力がカーネル レベルで行われるように、シミュレートされたハードウェア マウス。好ましいオプションではありませんが、必要に応じてsobeit
. (そして、必要に応じて、誰かがこれに役立つ情報を提供できますか?私はドライバーの作成をいじったことはありませんが、私が推測するすべてのことについて初めてです。)
TL;DR : ハードウェア以外の入力を無視しているように見えるゲームで、シミュレートされたマウス クリックを登録するにはどうすればよいですか? KEYEVENTF_SCANCODE
(つまり、キーボード入力をシミュレートするときに使用するのと同様に、マウス クリックが正当であるとゲームに認識させるにはどうすればよいでしょうか?)