全局键盘钩子在一段时间后没有响应

时间:2011-08-01 09:08:17

标签: c# hook global keyboard-hook keylogger

我使用的是以下代码,但几乎没有修改:

class globalKeyboardHook {

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

    public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct lParam);

    public keyboardHookProc hookP;

    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;
    #endregion


    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");

        hookP = new keyboardHookProc(hookProc);

        hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookP, 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);

}

有时在几个按键之后“hookProc”没有被调用,好像我已经“解开”了这个事件,并且它根本不会捕获任何按键。除非我手动完成,否则如何确保它永远不会解开事件?我怎样才能确保我继续订阅钩子?

谢谢。

0 个答案:

没有答案