private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            try
            {
                if (nCode >= 0)
                {
                    int vkCode = Marshal.ReadInt32(lParam);

                    if (OnKeyEventHandler != null)
                    {
                        var keyEventArgs = new KeyEvent();
                        if (wParam == (IntPtr)WM_KEYDOWN || wParam == (IntPtr)WM_SYSKEYDOWN)
                        {
                            keyEventArgs.KeyDownArgs(KeyInterop.KeyFromVirtualKey(vkCode));
                        }
                        else if (wParam == (IntPtr)WM_KEYUP || wParam == (IntPtr)WM_SYSKEYDOWN)
                        {
                            keyEventArgs.KeyUpArgs(KeyInterop.KeyFromVirtualKey(vkCode));
                        }
                        OnKeyEventHandler(this, keyEventArgs);
                    }
                }
                return CallNextHookEx(hookID, nCode, wParam, lParam);
            }
            catch(Exception ex)
            {
                Log.Add(ex);
            }
            return new IntPtr();
        }