2014-02-25 49 views
0

我正在開發DirectX遊戲的小工具,並且我想阻止用戶在某段時間內按某個鍵(本例中爲F12)。攔截並取消DirectX遊戲的按鍵事件

我可以找到許多用於模擬按鍵的選項,但在遊戲讀取之前將按鍵清零時有什麼選擇?

語言並不重要,但我寧願一個C#或C++的解決方案,或只是輕推在正確的方向:)

提前感謝!

+0

DirectX遊戲是你的,還是第三方(即你有源代碼)?另外,你在使用什麼操作系統? – parrowdice

+0

@parrowdice沒有遊戲不是我的,我沒有源代碼。它是第三方遊戲。我在Windows上。 – Nadeeja

+0

你可能想看看[Window's Hooks API](http://msdn.microsoft.com/en-us/library/windows/desktop/ms632589(v = vs.85).aspx)。這將允許您在系統到達目標窗口之前攔截系統中的消息。 –

回答

2

好消息是,我之前做過這件事,所以我可以說這是可能的,它確實有效。

壞消息是這並不簡單。它需要很多複雜的代碼,並且可能需要很長時間才能實現,但我會解釋如何做到這一點。

DirectX遊戲等應用程序通常爲register for raw input。 由於您想停止鍵盤事件到達應用程序,因此您需要在原始輸入和遊戲之間插入代碼,以便檢查原始輸入並決定是否允許它傳遞到遊戲:

所以,你想從改變流量:

Raw Input --> Game

Raw Input --> Your Code --> Game

而不必訪問至t他是遊戲的源代碼,你必須找到一種方法來插入你的代碼。

當有鍵盤輸入可用時,遊戲將調用WinAPI函數GetRawInputData,它會告訴它關於鍵盤事件。理想情況下,我們想要的是當遊戲調用此函數時,它實際上調用我們的代碼而不是WinAPI函數。然後我們可以決定告訴遊戲關於鍵盤事件的內容,我們可以告訴它我們想要的任何東西(例如忽略F12)。聽起來不錯吧?這裏有趣的地方......

我們可以利用Windows如何將可執行文件加載到內存中。通常,程序使用(或「導入」)調用其他DLL中的函數(如GetRawInputData,在User32.dll中)。當程序被加載到內存中時,Windows將在適當的DLL中使用指向可執行代碼的指針來填充表(導入地址表(IAT))。這意味着當程序調用該函數時,它將被引導到內存中的User32.dll中的可執行代碼來運行它。

如果我們可以將我們的某個函數的地址寫入/修補到該表中,那麼當遊戲調用GetRawInputData時,它會不會很棒?我們可以!它被稱爲導入地址表修補。

有一個相當不錯的article on it here在C++中的一些工作代碼。你應該首先閱讀它來更詳細地瞭解它是如何工作的,然後你可以修改它以支持你的需求。它會工作,但我知道它可能比你所期望的更多的工作(更多的工作),但基本上你正在竊取這個從不容易做到的應用程序。

值得去做,即使只是爲了更好地瞭解幕後的Windows。

祝你好運!

編輯

正如西蒙說,windows鉤子是一個更簡單的,如果遊戲沒有使用原始輸入做方式。 DirectX遊戲通常是一種特殊情況,對於標準Hooks來說,它們並不能很好地工作,因爲它們使用特殊方法從用戶那裏獲得輸入。儘管如此,儘管如此,如果它有效,它會變得更容易。

+0

謝謝你的詳細答案!你讓我對Windows的低級感興趣。 IAT補丁例如聽起來很棒。我會按照你的建議給Hooks一個嘗試,然而即使Hooks完成了工作,我也會試着實施你的方法。這將是一個非常好的學習練習。再次感謝:D – Nadeeja