2012-05-09 13 views
5

में नहीं, मैंने एक ऐसा ऐप्लिकेशन विकसित किया है जो वैश्विक कीबार्ड/माउस हुक का उपयोग करता है। यह विंडोज 7 में सही काम करता है, लेकिन विंडोज एक्सपी में नहीं।Windows XP में SetWindowsHookEx का उपयोग करते समय त्रुटि, लेकिन विंडोज 7

जब मैं Windows XP में SetWindowsHookEx कहते हैं, मैं त्रुटि कोड 1428

int MouseLowLevel = 14 
int code = SetWindowsHookEx(MouseLowLevel, 
       MouseHookProc, 
       IntPtr.Zero, 
       0); 

private IntPtr MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) {} 

उत्तर

11

जिज्ञासु कि इस कोड 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); 
+0

आप शानदार प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। अब यह विंडोज 7 और एक्सपी दोनों पर काम करता है। – magol

+2

आपके पास अपने कोड में एक और बग है, SetWindowsHookEx() के लिए वापसी प्रकार IntPtr है, int नहीं। –

+0

ओह, मैंने कोड को सरल बनाते समय कुछ त्रुटियां कीं। वास्तविक कोड में, मैं एक वर्ग का उपयोग करता हूं जो SafeHandleZeroOrMinusOneIsInvalid से विरासत में मिलता है। लेकिन जब मैं कोड संलग्न करता था तो मुझे बहुत अधिक जानकारी नहीं चाहिए था। लेकिन वैसे भी धन्यवाद :-) – magol

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