/// <summary>
        /// The primary keyboard hook callback.
        /// </summary>
        /// <param name="nCode">The 'n' code (unused).</param>
        /// <param name="wParam">The 'w' parameter (Windows message ID in this case).</param>
        /// <param name="lParam">The 'l' parameter (key pressed in this case).</param>
        /// <returns>The result of the hook callback continuation (or '1' to block).</returns>
        public IntPtr KeyboardHookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            int wParamInt = (int)wParam;

            if (nCode >= 0 && wParamInt < 1024 && HANDLED_WPARAMS[wParamInt])
            {
                bool isDown = wParamInt == WM_KEYDOWN || wParamInt == WM_SYSKEYDOWN;
                if (isDown || wParamInt == WM_KEYUP || wParamInt == WM_SYSKEYUP)
                {
                    int  vkCode = Marshal.ReadInt32(lParam);
                    Keys key    = (Keys)vkCode;
                    if (isDown)
                    {
                        if (!KeyBlockHandler.AllowKeyDown(key, false))
                        {
                            return((IntPtr)1);
                        }
                    }
                    else
                    {
                        if (!KeyBlockHandler.AllowKeyUp(key))
                        {
                            return((IntPtr)1);
                        }
                    }
                }
            }
            return(CallNextHookEx(KeyboardHookID, nCode, wParam, lParam));
        }