私は古いゲームを改造しようとしています。具体的には、Xboxコントローラ入力からキーボード入力をエミュレートしたいと思います。私はすでに、ゲームパッドの入力が働いていますが、ゲームはPostMessageで私が作る私の偽の入力を無視します(私は悪い結果と同様PostThreadMessageを試してみました。)メッセージループからPostMessageを無視したSetWindowsHookEx
だからここに私のコードのコア片、PeekMessageの迂回です:
BOOL WINAPI MyPeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg)
{
BOOL ret = RealPeekMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
if (lpMsg->message == WM_KEYDOWN)
{
cout << "Key press";
}
if (!ret)
{
if (joypadButtonDown)
{
LPARAM lparam = 0x00000001 | (LPARAM)(EnterScanCode << 16); // Scan code, repeat=1
BOOL res = PostMessage(mainHwnd, WM_KEYDOWN, VK_RETURN, lparam);
}
}
return ret;
}
ここで問題となるのは、ゲームでメッセージループを使用してキーボード入力を読み取るのではなく、独自のメインウィンドウスレッドでWH_KEYBOARDを使用するSetWindowsHookExを使用することです。
実際のキーを押すと何が起こるのですか:
ゲームのメインループは、フックプロシージャを呼び出す実際のPeekMessageを呼び出す私の迂回路を呼び出します。しかし、私が(同じパラメータを使って)私の偽のメッセージを送信すると、ゲームは再び私の迂回路を呼び出しますが、実際のPeekMessageはフック手順を呼び出さないので、入力を逃します。
いくつかの追加情報
:- 私はIDirectInputDevice8-> GetDeviceStateから直接のPostMessageを送信しようとした - すべては
(フックとメインループを設定し、メイン・ウィンドウの作成)同じスレッド上で起こることを私がチェックしました同じ結果
- フックプロシージャを直接呼び出すと、クラッシュが発生します(意味があります)。
中世に戻って感じる – texasbruce
偽のキーボード入力を送信してもフックは起動しません。真のキーボード入力のみがフックをトリガします。 SendInputを検討してください。 –
1)成功コードのために 'res'をチェックしてください。 2)なぜあなたはアプリケーションによって呼び出されているのですか?無限ループのようです(メッセージを投稿するとフックが邪魔になります) – krOoze