/// <summary>
 /// Register a callback for events
 /// </summary>
 /// <param name="eventId">String ID for event</param>
 /// <param name="listener">Listener object</param>
 public void RegisterCallback(string eventId, IHookListener listener)
 {
     if(!_callbacks.ContainsKey(eventId))
     {
         _callbacks[eventId] = new List<IHookListener>();
     }
     _callbacks[eventId].Add(listener);
 }
        public void Unregister(IHookListener listener)
        {
            if (listener == null)
                throw new ArgumentNullException("listener");

            UnhookWindowsHookEx(listener.HookPointer);
            ThrowExceptionIfLastErrorExists();
            listener.HookPointer = IntPtr.Zero;
        }
        private int HandleMessage(int code, IntPtr wparam, IntPtr lparam, IHookListener listener)
        {
            if (code == WM_HOTKEY)
            {
                var key = (Keys)wparam.ToInt32();
                listener.HandleHookMessage(key);

                return 1;
            }

            return CallNextHook(listener.HookPointer, code, wparam, lparam);
        }
        public void Register(IHookListener listener)
        {
            if (listener == null)
                throw new ArgumentNullException("listener");

            var hookPointer = SetWindowsHookEx(listener.HookId,
                                               new MessageHandler((c, w, l) => HandleMessage(c, w, l, listener)),
                                               IntPtr.Zero,
                                               GetCurrentThreadId());

            if (hookPointer == IntPtr.Zero)
                ThrowExceptionIfLastErrorExists();

            listener.HookPointer = hookPointer;
        }