2013-01-21 116 views
0

我正在嘗試重新映射遊戲(Elsword)的某些鍵。在Direct3D遊戲上重新映射鍵

所有我使用這段代碼模擬按鍵的第一:

#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; 
} 

在所有其它應用中,工作正常,但在遊戲窗口就什麼也不做......

+0

Afaik很難將輸入發送到具有DirectInput和Fullscreenmode的應用程序。也許嘗試使用窗口模式。 – Gnietschow

+0

我已經嘗試過,但仍然無法正常工作... – xXDraklordXx

+0

您可以嘗試使用API​​-Hooking http://en.wikipedia.org/wiki/Hooking#Hooking_Direct3D來操作輸入數據。 – Gnietschow

回答

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,並安裝鉤子(如果是「直接輸入鉤子「)。如果沒有,那麼你可以在Dependency Walker,IDA或OllyDbg中檢查每個加載的模塊,看看它們是否實現了自己的鍵盤處理程序,但事情現在變得相當複雜,並且需要大量的ASM知識和逆向工程技術。但是,如果您熟悉開發驅動程序,那麼這可能會有所幫助:SendInput Not working for Games