2010-08-22 24 views
7

Il enregistre les clés de la zone de texte pour le moment, c'est sûr. Le problème est quand je cours ceci à la machine virtuelle, ou à mon ordinateur portable d'amis, il se bloque après avoir pressé certaine quantité de clefs (aléatoire) .Il fonctionne parfaitement bien dans le mien.Global Hook Keylogger problème

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

Pourriez-vous s'il vous plaît être un peu plus précis? Comme, où est-ce que ça pend, quand? Des messages d'erreur? Pourriez-vous éditer vos questions avec un exemple de code minimal qui reproduit le problème? Et essayez d'en faire une question. –

+0

Monsieur, il semble y avoir aucune erreur d'exécution. Donc, je ne sais pas quelle partie du code produit le problème. Jetez un oeil au fichier que j'ai lié. Il a l'image de l'erreur -> "Keylogger ne répond pas". – RSTYLE

+0

Eh bien, vous pouvez attacher un débogueur et briser le processus pour voir où c'est. –

Répondre

9

Essayez le débogage de votre application avec le "CallbackOnCollectedDelegate" MDA activée (Debug -> Exceptions -> Managed Assistants Débogage -> vérifier "CallbackOnCollectedDelegate"). Le bug commun ici est que le délégué pour votre procédure de hook est automatiquement collecté par le GC après avoir défini le hook (il est créé dans le cadre du marshalling P/Invoke à SetWindowsHookEx). Une fois que le GC a collecté le délégué, le programme se bloque en essayant d'appeler le rappel. Cela expliquerait aussi le caractère aléatoire.

Si ceci est votre problème, vous verrez une erreur comme ce qui suit:

Un rappel a été fait sur une poubelle délégué recueilli de type « ... ». Cela peut provoquer des plantages d'application, corruption et perte de données. Lors du passage délégués au code non managé, ils doivent être maintenu en vie par l'application géré jusqu'à ce qu'il soit garanti qu'ils ne seront jamais appelés.

Essayez de garder une référence à votre procédure de crochet en tant que membre de votre classe, par exemple .:

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

WOW. OMG aime tellement !! Travailler parfaitement. wow wow wow – RSTYLE

+0

Voulez-vous accepter la réponse? Il aide les autres qui ont des problèmes similaires et encourage les autres à participer. Merci :) –

+0

Alrite (trop peu de mots) – RSTYLE