2012-08-04 72 views
11

是否可以檢測哪些應用程序正在使用OpenGL或DirectX類似於FRAPS的功能? (可能使用某種形式的鉤子)?我可能不需要實際繪製到窗口,我只需要知道哪些進程暫時正在進行某種形式的3D渲染。OpenGL/DirectX掛鉤 - 與FRAPS類似

(編輯:) 如果您不熟悉它,FRAPS是一個程序,可用於在3D應用程序上繪製「每秒幀數」計數器。 FRAPS可以自己查找所有正在運行的3D應用程序,而無需指定進程名稱。

的「幀每秒」反吸引到外部遊戲舉例: enter image description here

+0

我的猜測是你正在尋找的功能位於隱藏在微軟Windows API中的某個地方。我會尋找解決方案。 – Oskar 2012-08-05 18:04:33

+0

你可以看看http://taksi.sourceforge.net/。它是FRAPS的開源替代品。最重要的是你可以查看來源並找到你需要的東西。 – JohnGray 2012-08-06 06:00:27

+1

請注意,並非所有使用DirectX/Direct3d的應用程序都在進行3D渲染。我們使用D3D渲染H.264視頻。 – Deanna 2012-08-07 14:35:20

回答

8

也許最簡單的方法是檢查的OpenGL和DirectX核心庫的存在,可能也是一個好主意,在加在太驅動OGL的DLL(如nvogl),這可以通過EnumProcesses & EnumProcessModulesEx來完成,使用p/Invoke,這將至少給你的起始組的可能使用OGL或DX過程。

當然,一些應用程序加載這兩個API並且只使用一個,或者只是有條件地使用一個GFX API(儘管後者只發生在專門的工具等等),對於這個IMO來說,最好的方法檢查是執行某種形式的注入 或附加到調試程序會的過程,然後鉤住DX的Present或OGL的wglSwapBuffers

您可能即將逃脫不使用鉤通過枚舉GDI處理,並尋找DXGI或OGL渲染情境,如何可行的,這是,我不知道。

+0

來自MSDN:「如果從在WOW64上運行的32位應用程序調用此函數,則它只能枚舉32位進程的模塊。如果進程是64位進程,此函數將失敗,並且上一個錯誤代碼是ERROR_PARTIAL_COPY(299)。「這不是問題所在,但我需要能夠在32位/ 64位上運行的東西。如果過程是64位呢?這是否意味着如果我將應用程序編譯爲64位,它應該可以使用32/64?或者只有如果你是32位,你不能枚舉64位應用程序? – David 2012-08-08 12:46:42

+0

@David:有一個32位和64位的變體('EnumProcessModulesEx'),你需要一個64位的應用程序來獲得32位和64位的進程,但是你仍然需要一個32位版本32位操作系統。 – Necrolis 2012-08-08 13:59:18

6

據我瞭解,FRAPS採用了比較強力的方法來確定在哪裏放下店。該過程從SetWindowsHookEx開始,請求操作系統將FRAPS鉤子DLL加載到它可以[和將來的進程]的每個正在運行的進程中。 DLL中的魔力歸結爲使用GetModuleHandleA來運行一系列程序化測試,以觀察它所連接的進程是否加載了任何OpenGL/DirectX模塊。如果所有調用都返回NULL,掛鉤會嘗試從進程中刪除它自己。

在另一方面,如果處理已經裝載它們,它簡單地通過除去保護和注入JMP鉤子鉤住從該庫中的適當的渲染功能。 wglSwapBuffers通常是OpenGL中唯一相關的。當進程調用該函數時,它最終調用FRAPS模塊,然後FRAPS將後臺緩衝區捕獲到其隊列中,以編碼爲AVI並呈現其少量指示。然後它處理wglSwapBuffers的原始請求並將執行返回給程序。

至於在C#查詢...查看EasyHook(http://easyhook.codeplex.com/),看看如果它不爲你工作。我個人對此API沒有經驗。