2010-08-22 22 views
7

यह वर्तमान में टेक्स्टबॉक्स में कुंजी को लॉग करता है ताकि यह सुरक्षित हो।ग्लोबल हुक कीलॉगर समस्या

समस्या समस्या है जब मैं आभासी मशीन पर इस चलाते हैं, या अपने दोस्तों के लैपटॉप, यह चाबियों का निश्चित मात्रा में दबाने के बाद लटका हुआ है (यादृच्छिक) यह मेरा में बिल्कुल ठीक चलाता है।

http://i34.tinypic.com/29o1im8.jpg

class GlobalKeyboardHook 
{ 


    #region Definition of Structures, Constants and Delegates 

    public delegate int KeyboardHookProc(int nCode, int wParam, ref GlobalKeyboardHookStruct lParam); 

    public struct GlobalKeyboardHookStruct 
    { 
     public int vkCode; 
     public int scanCode; 
     public int flags; 
     public int time; 
     public int dwExtraInfo; 
    } 

    const int WM_KEYDOWN = 0x100; 
    const int WM_KEYUP = 0x101; 
    const int WM_SYSKEYDOWN = 0x104; 
    const int WM_SYSKEYUP = 0x105; 
    const int WH_KEYBOARD_LL = 13; 

    #endregion 

    #region Events 

    public event KeyEventHandler KeyDown; 
    public event KeyEventHandler KeyUp; 

    #endregion 

    #region Instance Variables 

    public List<Keys> HookedKeys = new List<Keys>(); 
    IntPtr hookHandle = IntPtr.Zero; 

    #endregion 

    #region DLL Imports 

    [DllImport("kernel32.dll")] 
    static extern IntPtr LoadLibrary(string lpFileName); 

    [DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall, SetLastError = true)] 
    static extern IntPtr SetWindowsHookEx(int hookID, KeyboardHookProc callback, IntPtr hInstance, uint threadID); 

    [DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall, SetLastError = true)] 
    static extern bool UnhookWindowsHookEx(IntPtr hookHandle); 

    [DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)] 
    static extern int CallNextHookEx(IntPtr hookHandle, int nCode, int wParam, ref GlobalKeyboardHookStruct lParam); 




    #endregion 

    #region Public Methods 

    public int hookProc(int nCode, int wParam, ref GlobalKeyboardHookStruct lParam) 
    { 

     if (nCode >= 0) 
     { 
      Keys key = (Keys)lParam.vkCode; 

      if (HookedKeys.Contains(key) == true) 
      { 
       KeyEventArgs kea = new KeyEventArgs(key); 

        if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && KeyUp != null) 
        { 
         KeyUp(this, kea); 
        } 
        else if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && KeyDown != null) 
        { 
         KeyDown(this, kea); 
        } 
        if (kea.Handled) return 1; 


      } 
     } 

    return CallNextHookEx(hookHandle, nCode, wParam, ref lParam); 
    } 


    public void hook() 
    { 
      IntPtr hInstance = LoadLibrary("user32"); 
      hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, hInstance, 0); 
    } 


    public void unhook() 
    { 
     UnhookWindowsHookEx(hookHandle); 
    } 

    #endregion 

    #region Constructors and Destructors 

    public GlobalKeyboardHook() 
    { 
     hook(); 
    } 

    ~GlobalKeyboardHook() 
    { 
     unhook(); 
    } 

    #endregion 
+0

आप कृपया थोड़ा और अधिक विशिष्ट हो सकता है? पसंद है, यह कहाँ लटका है, कब? कोई त्रुटि संदेश? क्या आप अपने प्रश्नों को न्यूनतम कोड उदाहरण के साथ संपादित कर सकते हैं जो समस्या को पुन: उत्पन्न करता है? और इसे एक प्रश्न बनाने की कोशिश करो। –

+0

सर वहाँ कोई रनटाइम त्रुटि प्रतीत नहीं होता है। तो मुझे पता नहीं है कि कोड का कौन सा हिस्सा समस्या उत्पन्न करता है। मेरे द्वारा लिंक की गई फ़ाइल पर एक नज़र डालें। इसमें त्रुटि की तस्वीर है -> "कीलॉगर प्रतिक्रिया नहीं दे रहा है"। – RSTYLE

+0

ठीक है आप एक डीबगर संलग्न कर सकते हैं और यह देखने के लिए प्रक्रिया को तोड़ सकते हैं कि यह कहां है। –

उत्तर

9

"CallbackOnCollectedDelegate" एमडीए के साथ अपने आवेदन डिबगिंग प्रयास करें चालू (-> अपवाद - डीबग> प्रबंधित सहायकों डिबगिंग -> जाँच "CallbackOnCollectedDelegate")।

यहां सामान्य बग यह है कि हुक सेट करने के बाद आपकी हुक प्रक्रिया के प्रतिनिधि को स्वचालित रूप से जीसी द्वारा एकत्र किया जाता है (यह पी/आवेक मार्शलिंग के हिस्से के रूप में बनाया जाता है SetWindowsHookEx)। जीसी प्रतिनिधि को इकट्ठा करने के बाद, कॉलबैक कॉल करने का प्रयास करते समय प्रोग्राम क्रैश हो जाता है। यह यादृच्छिकता भी समझाएगा।

इससे आपकी समस्या है, तो आप निम्नलिखित की तरह एक त्रुटि दिखाई देगी:

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

अपनी कक्षा में एक सदस्य के रूप में अपने हुक प्रक्रिया के लिए एक संदर्भ रखने का प्रयास करें, उदा .:

public delegate int KeyboardHookProc(int nCode, int wParam, ref GlobalKeyboardHookStruct lParam); 

public int hookProc(int nCode, int wParam, ref GlobalKeyboardHookStruct lParam) 
{ 
    // ... 
} 

public void hook() 
{ 
    _hookProc = new KeyboardHookProc(hookProc); 
    IntPtr hInstance = LoadLibrary("user32"); 
    hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, _hookProc, hInstance, 0); 
} 

KeyboardHookProc _hookProc; 
+0

वाह। ओएमजी बहुत धन्यवाद !! पूरी तरह से काम करना वाह वाह वाह – RSTYLE

+0

उत्तर स्वीकार करने के लिए देखभाल? यह उन लोगों की सहायता करता है जिनके पास समान समस्याएं हैं और दूसरों को भाग लेने के लिए प्रोत्साहित करती है। धन्यवाद :) –

+0

अल्राइट (बहुत कम शब्द) – RSTYLE