जिज्ञासु कि इस कोड Win7 पर विफल नहीं करता, लेकिन मैं निश्चित रूप से कभी नहीं की कोशिश की हो। लेकिन यह सही व्यवहार है, ऐसा लगता है कि उन्होंने इसे बेहतर बनाया है। SetWindowsHookEx() के लिए तर्क सत्यापन के लिए वैध गैर-शून्य 3 या 4 वें तर्क की आवश्यकता होती है। त्रुटि कोड अत्यधिक वर्णनात्मक है, WinError.h से:
//
// MessageId: ERROR_HOOK_NEEDS_HMOD
//
// MessageText:
//
// Cannot set nonlocal hook without a module handle.
//
#define ERROR_HOOK_NEEDS_HMOD 1428L
किसी भी मॉड्यूल संभाल के बाद से यह वास्तव में निम्न स्तर के हुक के लिए इस्तेमाल नहीं होता है क्या करेंगे, कोई DLL उन्हें काम करने के लिए इंजेक्शन की जरूरत है। किसी को चुनने में कुछ देखभाल .NET 4 के लिए आवश्यक है क्योंकि इसके सीएलआर अब शुद्ध प्रबंधित असेंबली के लिए मॉड्यूल हैंडल को नकल नहीं करते हैं। उपयोग करने के लिए एक अच्छा वह है जिसे आप LoadLibrary ("user32.dll") को पिनवोक करने से बाहर निकलते हैं क्योंकि यह हमेशा से पहले ही लोड हो जाता है। आपको FreeLibrary() को कॉल करने की आवश्यकता नहीं है।
आप LoadLibrary कॉल करने के लिए इस घोषणा की आवश्यकता होगी:
[DllImport("kernel32", SetLastError=true, CharSet = CharSet.Auto)]
private static extern IntPtr LoadLibrary(string fileName);
स्रोत
2012-05-09 12:56:03
आप शानदार प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। अब यह विंडोज 7 और एक्सपी दोनों पर काम करता है। – magol
आपके पास अपने कोड में एक और बग है, SetWindowsHookEx() के लिए वापसी प्रकार IntPtr है, int नहीं। –
ओह, मैंने कोड को सरल बनाते समय कुछ त्रुटियां कीं। वास्तविक कोड में, मैं एक वर्ग का उपयोग करता हूं जो SafeHandleZeroOrMinusOneIsInvalid से विरासत में मिलता है। लेकिन जब मैं कोड संलग्न करता था तो मुझे बहुत अधिक जानकारी नहीं चाहिए था। लेकिन वैसे भी धन्यवाद :-) – magol