2012-08-04 13 views
11

के समान क्या यह पता लगाना संभव है कि कौन से अनुप्रयोग ओपनजीएल या डायरेक्टएक्स का उपयोग कर रहे हैं जो FRAPS करता है? (शायद हुक के कुछ रूप का उपयोग कर)? मुझे शायद खिड़की पर वास्तव में आकर्षित करने की आवश्यकता नहीं होगी, मुझे बस यह जानने की जरूरत है कि कौन सी प्रक्रियाएं समय के लिए 3 डी प्रतिपादन के कुछ रूप कर रही हैं।ओपनजीएल/डायरेक्टएक्स हुक - FRAPS

(संपादित करें :) यदि आप इससे परिचित नहीं हैं, तो FRAPS एक ऐसा प्रोग्राम है जिसका उपयोग 3 डी एप्लिकेशन पर "फ़्रेम-प्रति-सेकंड" काउंटर बनाने के लिए किया जा सकता है। FRAPS प्रक्रिया नाम निर्दिष्ट करने के लिए आपको बिना किसी चल रहे 3 डी अनुप्रयोगों को स्वयं पाता है।

बाहरी खेल के लिए तैयार काउंटर "प्रति सेकंड फ़्रेम" का उदाहरण: enter image description here

+0

मेरा अनुमान है कि जिस फ़ंक्शन को आप ढूंढ रहे हैं वह कहीं माइक्रोसॉफ्ट के विंडोज एपीआई में छिपा हुआ है। मैं समाधान के लिए वहां देखता हूं। – Oskar

+0

आप http://taksi.sourceforge.net/ पर एक नज़र डाल सकते हैं। यह FRAPS के लिए एक ओपनसोर्स विकल्प है। सबसे बड़ी बात यह है कि आप स्रोतों को देख सकते हैं और आपको जो चाहिए उसे ढूंढ सकते हैं। – JohnGray

+1

सावधान रहें कि डायरेक्टएक्स/डायरेक्ट 3 डी का उपयोग करने वाले सभी एप्लिकेशन 3 डी प्रतिपादन नहीं कर रहे हैं। हम H.264 वीडियो के प्रतिपादन के लिए डी 3 डी का उपयोग करते हैं। – Deanna

उत्तर

8

शायद सबसे आसान तरीका है OpenGL और DirectX मुख्य लाइब्रेरीज की उपस्थिति की जांच करने के लिए, शायद यह भी एक अच्छा विचार में जोड़ने के लिए है चालक ओजीएल डीएलएस भी (जैसे कि एनवीओजीएल), यह EnumProcesses & EnumProcessModulesEx के माध्यम से पी/इनवॉक का उपयोग करके किया जा सकता है, यह कम से कम आपको ओजीएल या डीएक्स का उपयोग कर प्रक्रियाओं का एक प्रारंभिक सेट देगा।

बेशक

कुछ अनुप्रयोगों एपीआई के दोनों लोड और केवल एक ही उपयोग करें, या केवल सशर्त GFX एपीआई (हालांकि उनसे केवल विशेष उपकरणों और तरह के साथ होता है), इस के लिए, IMO, सबसे अच्छा तरीका है की एक का उपयोग करें जांचने के लिए इंजेक्शन के कुछ रूपों को निष्पादित करना या डीबगर जैसी प्रक्रिया को जोड़ना, फिर ओजीएल के लिए 0xया डीएक्स या wglSwapBuffers के लिए हुकिंग करना होगा।

आप जीडीआई हैंडल की गणना करके और डीएक्सजीआई या ओजीएल प्रस्तुत संदर्भों की तलाश करके एक हुक का उपयोग न करने के साथ दूर हो सकते हैं, यह कितना व्यवहार्य है, मुझे नहीं पता।

+0

एमएसडीएन से: "यदि यह फ़ंक्शन 32-बिट एप्लिकेशन से WOW64 पर चल रहा है, तो यह केवल 32-बिट प्रक्रिया के मॉड्यूल को समझा सकता है। यदि प्रक्रिया 64-बिट प्रक्रिया है, तो यह फ़ंक्शन विफल रहता है और अंतिम त्रुटि कोड ERROR_PARTIAL_COPY (2 9 9) है। " यह सवाल में नहीं था, लेकिन मुझे 32/64 बिट दोनों पर काम करने की ज़रूरत है। अगर प्रक्रिया 64 बिट है तो क्या होगा? क्या इसका मतलब यह है कि यदि मैं ऐप को 64 बिट तक संकलित करता हूं तो इसे 32/64 के साथ काम करना चाहिए? या केवल अगर आप 32 बिट हैं तो आप 64 बिट ऐप्स का आकलन नहीं कर सकते हैं? – David

+0

@ डेविड: 32 और 64 बिट संस्करण उपलब्ध है ('EnumProcessModulesEx'), 32 और 64 बिट प्रक्रियाओं को प्राप्त करने के लिए आपको 64 बिट ऐप की आवश्यकता होगी (टिप्पणियां देखें), और आपको अभी भी 32 बिट बिल्ड की आवश्यकता होगी 32 बिट ओएसईएस – Necrolis

1

आपको How to overlay graphics on Windows games? और लिंक किए गए आलेख http://www.ring3circus.com/gameprogramming/case-study-fraps/ पर एक नज़र डालना चाहिए।

दूसरे लिंक में कुछ अवधारणा कोड हैं जो वास्तविक हुक भाग करना चाहिए। यह इस जवाब में प्रतिलिपि बनाने और चिपकाने जैसा महसूस करने के बारे में कुछ और विस्तार में भी जाता है।

6

जो मैं समझता हूं, उससे FRAPS अपेक्षाकृत क्रूर बल दृष्टिकोण का उपयोग करता है यह निर्धारित करने के लिए कि दुकान कहां रखना है। यह प्रक्रिया अनुरोध करने के लिए SetWindowsHookEx के साथ प्रक्रिया शुरू हो जाती है कि ओएस FRAPS हुक DLL को प्रत्येक चल रही प्रक्रिया में लोड कर सकता है [और भविष्य की प्रक्रियाओं]। डीएलएल में जादू GetModuleHandleA का उपयोग करके परीक्षणों के एक प्रक्रियात्मक सेट को चलाने के लिए नीचे आता है यह देखने के लिए कि क्या यह प्रक्रिया किसी ओपनजीएल/डायरेक्टएक्स मॉड्यूल को लोड कर चुकी है या नहीं। यदि सभी कॉल न्यूल लौटते हैं, तो हुक प्रक्रिया से खुद को हटाने का प्रयास करता है।

दूसरी ओर, यदि प्रक्रिया ने उन्हें लोड किया है, तो यह सुरक्षा को हटाने और जेएमपी हुक इंजेक्शन द्वारा उस लाइब्रेरी से उपयुक्त प्रतिपादन फ़ंक्शन को बस हुक करता है। wglSwapBuffers आमतौर पर ओपनजीएल में एकमात्र प्रासंगिक है। जब प्रक्रिया इस फ़ंक्शन को कॉल करती है, तो यह FRAPS मॉड्यूल को कॉल करने के समाप्त होती है और फिर FRAPS एवीआई को एन्कोडिंग के लिए बैक बफर को अपनी कतार में कैप्चर करता है और इसके छोटे संकेत प्रस्तुत करता है। फिर यह wglSwapBuffers के मूल अनुरोध को संसाधित करता है और निष्पादन को प्रोग्राम पर वापस देता है।

जहां तक ​​सी # में पूछताछ है ... समीक्षा EasyHook (http://easyhook.codeplex.com/) और देखें कि यह आपके लिए काम नहीं करता है या नहीं। मुझे व्यक्तिगत रूप से इस एपीआई के साथ कोई अनुभव नहीं है।

संबंधित मुद्दे