2016-04-28 72 views
-1

我正在嘗試修改一個較舊的遊戲,更具體地說,我想模擬通過Xbox控制器輸入的鍵盤輸入。我已經有遊戲手柄輸入工作,但遊戲忽略我的假輸入我PostMessage創建(我試過PostThreadMessage以及與更壞的結果。)SetWindowsHookEx忽略來自消息循環的PostMessage

因此,這裏的核心是一塊我的代碼,而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; 
}  

現在的問題是,遊戲不使用它的消息循環讀取鍵盤輸入,而是使用調用SetWindowsHookEx與自己的主窗口線程WH_KEYBOARD。
所以在真正的按鍵按下會發生什麼是:
遊戲的主循環調用我的繞道調用真正的PeekMessage調用鉤子程序。但是如果我發送我的假消息(使用相同的參數),遊戲會再次調用我的繞道,但真正的PeekMessage不會調用鉤子程序,因此會錯過輸入。

一些額外的信息:
- 我檢查了,一切都發生在同一個線程(主窗口創建,設置鉤和主循環)
- 我試圖與直接從IDirectInputDevice8-> GetDeviceState發送PostMessage的相同的結果
- 調用掛鉤過程直接導致崩潰(這是有道理的)。

+0

感覺回到中世紀 – texasbruce

+4

發佈假鍵盤輸入不會觸發掛鉤。只有真正的鍵盤輸入纔會觸發掛鉤。考慮SendInput。 –

+0

1)檢查'res'獲取成功代碼。 2)爲什麼(何時)你甚至被應用程序調用?看起來像一個無盡的循環(你發佈消息,你的鉤子攔截它) – krOoze

回答

0

我發現了一個有點骯髒的解決方法。我直接調用遊戲的SetWindowsHookEx KeyboardProc回調函數,並通過繞開CallNextHookEx忽略我的假鉤子調用來避免我在OP中提到的崩潰。