2016-04-28 12 views
-1

私は古いゲームを改造しようとしています。具体的には、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を呼び出す私の迂回路を呼び出します。しかし、私が(同じパラメータを使って)私の偽のメッセージを送信すると、ゲームは再び私の迂回路を呼び出しますが、実際のP​​eekMessageはフック手順を呼び出さないので、入力を逃します。

いくつかの追加情報


- 私はIDirectInputDevice8-> GetDeviceStateから直接のPostMessageを送信しようとした - すべては
(フックとメインループを設定し、メイン・ウィンドウの作成)同じスレッド上で起こることを私がチェックしました同じ結果
- フックプロシージャを直接呼び出すと、クラッシュが発生します(意味があります)。

+0

中世に戻って感じる – texasbruce

+4

偽のキーボード入力を送信してもフックは起動しません。真のキーボード入力のみがフックをトリガします。 SendInputを検討してください。 –

+0

1)成功コードのために 'res'をチェックしてください。 2)なぜあなたはアプリケーションによって呼び出されているのですか?無限ループのようです(メッセージを投稿するとフックが邪魔になります) – krOoze

答えて

0

私はやや汚れた回避策を見つけました。私はゲームのSetWindowsHookEx KeyboardProcコールバックを直接呼び、CallNextHookExを私の偽のフックコールを無視するように迂回させてOPで言及したクラッシュを回避します。

関連する問題