2012-11-14 6 views
7

यदि मेरे पास एक हैंडल के साथ एक कंसोल एप्लिकेशन है जो इसे स्थापित करता है;सी ++: कंसोल एप्लिकेशन के लिए एक नया wndProc कैसे सेट करें?

HWND hWnd = GetConsoleWindow(); 

फिर मैं विंडो के लिए एक नया wndProc कैसे स्थापित करूं?
मैं

SetWindowLong(hWnd, GWL_WNDPROC, (LONG)conProc); 

का उपयोग कर के साथ conProc रूप

LRESULT CALLBACK conProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(msg) 
    { 
     case WM_NCHITTEST: 
      return HTCAPTION; 
    } 
    return DefWindowProc(hWnd, msg, wParam, lParam); 
} 

परिभाषित किया जा रहा करने की कोशिश की लेकिन यह काम नहीं करता है और कहता है "त्रुटि कोड: 5 - प्रवेश निषेध है" GetLastError()

मैं समझता हूँ पर कि इस तरह कंसोल एप्लिकेशन को संशोधित करना बहुत मुश्किल है, क्योंकि यह एक csrss.exe एप्लिकेशन है और सब कुछ है, लेकिन मैं अभी भी कोशिश करना चाहता हूं .. धन्यवाद।

+0

क्या है कि * के लिए * है के आधार पर आप [कंसोल प्रोजेक्ट] मिल सकता है (http: // sourceforge .NET/परियोजनाओं/कंसोल /) उपयोगी। –

+2

यह दिलचस्प है क्योंकि मैं कहने जा रहा था कि आप इसके साथ जुड़े 'WNDCLASSEX' को पकड़ सकते हैं और अपनी खिड़की को उस के आधार पर बना सकते हैं, लेकिन यह' WNDCLASSEX' को पकड़ना थोड़ा मुश्किल है। 'GetClassInfoEx' को मॉड्यूल हैंडल की आवश्यकता है, और उस हैंडल को परेशान करना मुश्किल है। यहां तक ​​कि 'CreateToolhelp32 स्नैपशॉट' स्पष्ट रूप से बताता है कि आप csrss.exe के साथ इसका उपयोग नहीं कर सकते हैं। – chris

उत्तर

10

जबकि छाप (अन्य खिड़की की तरह) है कि कंसोल विंडो में आपके प्रक्रिया के अंतर्गत आता है है, यह CSRSS सिस्टम प्रक्रिया द्वारा की मेजबानी की वास्तव में है और इसकी WndProc है। यह आपको खिड़की को उपclass करने में असमर्थ बनाता है और अपनी प्रक्रिया में अपना स्वयं का WndProc प्रदान करता है।

कुछ संबंधित पढ़ने:

+0

मैं वास्तव में "यह नहीं किया जा सकता" उत्तर की तलाश में नहीं हूं, लेकिन आपने मुझे कुछ दिलचस्प लिंक दिए हैं, इसलिए मैंने आपको ऊपर उठाया। मैंने लोगों को इस तरह की चीजें करने में सक्षम होने के बारे में सुना है, और मुझे दिलचस्पी है कि उन्होंने यह कैसे किया। मैंने एक त्वरित Google खोज की, और मुझे यह पता चला: http://www.codeforge.com/read/115608/CsrssHook.c__html - ऐसा लगता है कि यह एक नमूना कोड है जो CSRSS में हुक करने के लिए उपयोग किया जाता है। मुझे लगता है कि यह किसी तरह का प्रमाण होगा कि यह किया जा सकता है ..? –

+0

नमूना जिसे आपने लक्ष्य प्रक्रिया में कोड इंजेक्शन लागू करने के लिए संदर्भित किया है, ताकि आप उस प्रक्रिया के भीतर अपना स्वयं का 'WNDProc' प्रदान कर सकें ... यदि आपके पास सिस्टम प्रक्रिया को हुक करने के लिए पर्याप्त अनुमतियां हैं, तो यह काम कर सकता है। 'ओपनप्रोसेस (PROCESS_ALL_ACCESS, ...' –

+1

विंडोज 7+ में कंसोल विंडो conhost.exe द्वारा होस्ट की गई है, जो ग्राहक के सुरक्षा संदर्भ में चलती है, यानी इस मामले में आप 'ERROR_ACCESS_DENIED'' को लेकर आश्चर्यचकित न हों 'PROCESS_ALL_ACCESS' है। – eryksun

0

सबसे पहले सेटविंडोलोंग को सेटविंडोलॉन्गपीआर द्वारा अधिभारित किया गया है, तो आपको उस फ़ंक्शन का उपयोग करना चाहिए।

क्या आप अपनी स्वयं की कंसोल विंडो या किसी अन्य प्रक्रिया के WNDPROC को बदलने की कोशिश कर रहे हैं?

MSDN डॉक्स से:

GWL_WNDPROC -4 Sets a new address for the window procedure. You cannot change this attribute if the window does not belong to the same process as the calling thread.

+4

उनकी स्वयं की कंसोल विंडो दूसरी प्रक्रिया से संबंधित है, –

+0

क्या हंस पासेंट ने कहा। –

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