दिलचस्प पोस्ट
javax.mail.MessagingException: एसएमटीपी होस्ट से कनेक्ट नहीं हो सका: smtp.gmail.com, पोर्ट: 25; उपकरण को समाप्त / जावास्क्रिप्ट असंपोड़ करने के लिए उपकरण एंड्रॉइड व्यूपैगर – पृष्ठ का पूर्वावलोकन बाएं और दाएं पर दिखाएं एआरसी के साथ @प्रॉपर्टी परिभाषाएं: मजबूत या बनाए रखे? क्या कोई जीसीसी प्रीप्रोसेसर निदेशालय है कि क्या जांच की जा रही है कि कोड 64 बिट मशीन पर संकलित किया जा रहा है? उच्च-लोड साइट में PHP का उपयोग करने की रणनीति XML फ़ाइल को पार्स करने के दौरान सीडीटा सामग्री प्राप्त करना त्रुटि: अनुरोध हैडर फ़ील्ड सामग्री-प्रकार का उपयोग-नियंत्रण-अनुमति-हेडर द्वारा अनुमति नहीं है क्या मैं निर्धारित कर सकता हूं कि कोई स्ट्रिंग एक मोंगोडीबी ऑब्जेक्ट है? एक MDF फ़ाइल क्या है? एसक्यूएल में महीना नाम समारोह में महीना संख्या को कनवर्ट करें कमांड के साथ व्यवस्थापक के रूप में सीएमडी को चलाने के लिए? हैश कोड क्या है? क्या यह अद्वितीय है? \ w और \ b नियमित अभिव्यक्ति मेटा वर्णों में अंतर बैच फ़ाइल में पाथ वातावरण चर को केवल एक बार विंडोज पर कैसे सेट करें?

कॉलबैकऑनलाइन चुने गए ग्लोबलकीबोर्ड हुक में निपटा गया

मैं एक वैश्विक कीबोर्ड हुक क्लास का उपयोग कर रहा हूं I यह कक्षा यह जांचने की अनुमति देता है कि कीबोर्ड कुंजी को कहीं भी दबाया गया हो और कुछ समय बाद मुझे एक त्रुटि आ रही है:

**CallbackOnCollectedDelegate was detected** A callback was made on a garbage collected delegate of type 'Browser!Utilities.globalKeyboardHook+keyboardHookProc::Invoke'. This may cause application crashes, corruption and data loss. When passing delegates to unmanaged code, they must be kept alive by the managed application until it is guaranteed that they will never be called. 

यहाँ globalkeyboard हुक वर्ग है:

  public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct lParam); public struct keyboardHookStruct { public int vkCode; public int scanCode; public int flags; public int time; public int dwExtraInfo; } const int WH_KEYBOARD_LL = 13; const int WM_KEYDOWN = 0x100; const int WM_KEYUP = 0x101; const int WM_SYSKEYDOWN = 0x104; const int WM_SYSKEYUP = 0x105; public List<Keys> HookedKeys = new List<Keys>(); IntPtr hhook = IntPtr.Zero; public event KeyEventHandler KeyDown; public event KeyEventHandler KeyUp; public globalKeyboardHook() { hook(); } ~globalKeyboardHook() { unhook(); } public void hook() { IntPtr hInstance = LoadLibrary("User32"); hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, hInstance, 0); } public void unhook() { UnhookWindowsHookEx(hhook); } public int hookProc(int code, int wParam, ref keyboardHookStruct lParam) { if (code >= 0) { Keys key = (Keys)lParam.vkCode; if (HookedKeys.Contains(key)) { KeyEventArgs kea = new KeyEventArgs(key); if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null)) { KeyDown(this, kea); } else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null)) { KeyUp(this, kea); } if (kea.Handled) return 1; } } return CallNextHookEx(hhook, code, wParam, ref lParam); } [DllImport("user32.dll")] static extern IntPtr SetWindowsHookEx(int idHook, keyboardHookProc callback, IntPtr hInstance, uint threadId); [DllImport("user32.dll")] static extern bool UnhookWindowsHookEx(IntPtr hInstance); [DllImport("user32.dll")] static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, ref keyboardHookStruct lParam); [DllImport("kernel32.dll")] static extern IntPtr LoadLibrary(string lpFileName); #endregion 

क्या इसे ठीक करने का कोइ उपाय है? यह कार्यक्रम अच्छी तरह से काम करता है, लेकिन कुछ समय बाद प्रोग्राम को मुसीबतों को रोकता है, मुझे यह त्रुटि मिलती है।

Solutions Collecting From Web of "कॉलबैकऑनलाइन चुने गए ग्लोबलकीबोर्ड हुक में निपटा गया"

 hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, hInstance, 0); 

आपकी समस्या है आप सी # सिंटैक्स शर्करा पर भरोसा कर रहे हैं ताकि इसे स्वचालित रूप से हुक प्रोक के लिए एक प्रतिनिधि ऑब्जेक्ट बनाया जा सके वास्तविक कोड पीढ़ी इस तरह दिखती है:

 keyboardHookProc $temp = new keyboardHookProc(hookProc); hhook = SetWindowsHookEx(WH_KEYBOARD_LL, $temp, hInstance, 0); 

प्रतिनिधि वस्तु का केवल एक संदर्भ है, $ temp लेकिन यह स्थानीय वैरिएबल है और जैसे ही आपके हुक () विधि निष्पादित और रिटर्न के बंद हो जाता है, गायब हो जाता है। कचरा कलेक्टर अन्यथा यह देखने के लिए शक्तिहीन है कि विंडोज के पास इसके 'संदर्भ' भी है, यह संदर्भों के लिए अप्रबंधित कोड की जांच नहीं कर सकता है। तो अगली बार कचरा कलेक्टर चलाता है, प्रतिनिधि ऑब्जेक्ट को नष्ट हो जाता है और यह एक कबाब है जब विंडोज हुक कॉलबैक बनाता है अंतर्निहित एमडीए समस्या का पता लगाता है और एक प्रवेश विवाद के साथ प्रोग्राम क्रैश होने से पहले उपयोगी नैदानिक ​​उत्पन्न करता है।

आपको प्रतिनिधि वस्तु की एक अतिरिक्त संदर्भ बनाने की आवश्यकता होगी जो लंबे समय तक जीवित रहती है उदाहरण के लिए आप जीसीएंडल का इस्तेमाल कर सकते हैं। या आसान, बस एक संदर्भ खुद को स्टोर करें ताकि कचरा कलेक्टर हमेशा संदर्भ देख सकें। अपनी कक्षा में फ़ील्ड जोड़ें इसे स्थैतिक बनाना ऑब्जेक्ट को एकत्रित नहीं किया जा सकता है यह सुनिश्चित करने के लिए एक निश्चित-आग तरीका है:

  private static keyboardHookProc callbackDelegate; public void hook() { if (callbackDelegate != null) throw new InvalidOperationException("Can't hook more than once"); IntPtr hInstance = LoadLibrary("User32"); callbackDelegate = new keyboardHookProc(hookProc); hhook = SetWindowsHookEx(WH_KEYBOARD_LL, callbackDelegate, hInstance, 0); if (hhook == IntPtr.Zero) throw new Win32Exception(); } public void unhook() { if (callbackDelegate == null) return; bool ok = UnhookWindowsHookEx(hhook); if (!ok) throw new Win32Exception(); callbackDelegate = null; } 

नि: शुल्क लांच करने के लिए कोई ज़रूरत नहीं है, user32.dll हमेशा आपके प्रोग्राम समाप्त होने तक लोड हो जाती है।