/// <summary>
        /// The callback for the keyboard hook
        /// </summary>
        /// <param name="code">The hook code, if it isn't >= 0, the function shouldn't do anyting</param>
        /// <param name="wParam">The event type</param>
        /// <param name="lParam">The keyhook event information</param>
        /// <returns></returns>
        public int hookProc(int code, int wParam, ref keyboardHookStruct lParam)
        {
            if (code >= 0)
            {
                Keys           key = (Keys)lParam.vkCode;
                keyboardPacket kp  = new keyboardPacket();
                if (HookedKeys.Contains(key) || HookAll == true)
                {
                    bool bAlt = (NativeMethods.GetKeyState((int)WindowsVirtualKey.VK_LMENU) & 0x8000) != 0;
                    bAlt |= (NativeMethods.GetKeyState((int)WindowsVirtualKey.VK_RMENU) & 0x8000) != 0;
                    bool bShift = (NativeMethods.GetKeyState((int)WindowsVirtualKey.VK_LSHIFT) & 0x8000) != 0;
                    bShift |= (NativeMethods.GetKeyState((int)WindowsVirtualKey.VK_RSHIFT) & 0x8000) != 0;
                    bool bControl = (NativeMethods.GetKeyState((int)WindowsVirtualKey.VK_LCONTROL) & 0x8000) != 0;
                    bControl |= (NativeMethods.GetKeyState((int)WindowsVirtualKey.VK_RCONTROL) & 0x8000) != 0;

                    KeyEventArgs kea = new KeyEventArgs(
                        key |
                        (bAlt ? Keys.Alt : Keys.None) |
                        (bShift ? Keys.Shift : Keys.None) |
                        (bControl ? Keys.Control : Keys.None)
                        );

                    Debug.WriteLine("Code : {0}, wParam : {1}, lParam.vkCode :{2}", code, wParam, lParam.vkCode);
                    Debug.WriteLine("lParam.scanCode : {0}, lParam.flag : {1}, lParam.dwExtraInfo :{2}", lParam.scanCode, lParam.flags, lParam.dwExtraInfo);
                    Debug.WriteLine("Alt : {0}, Ctrl : {1}, Shift : {2}", bAlt, bControl, bShift);

                    if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null))
                    {
                        KeyDown(this, kea);
                        kp.flags = FLAG_KEYDOWN;
                    }
                    else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null))
                    {
                        KeyUp(this, kea);
                        kp.flags = FLAG_KEYUP;
                    }
                    kp.vkCode = lParam.vkCode;
                    if (DonotFireEvent == false)
                    {
                        if (LastInputForCommand == false)
                        {
                            KeyEvent(kp);
                        }
                        else
                        {
                            LastInputForCommand = false;
                        }

                        if (kea.Handled)
                        {
                            return(1);
                        }
                    }
                }
            }

            return(CallNextHookEx(hhook, code, wParam, ref lParam));
        }
 public void FireKeyEvent(IKeyboardSimulator a_iks, keyboardPacket a_kp)
 {
     if (a_kp.flags == 0x00)
     {
         a_iks.KeyUp((WindowsInput.Native.VirtualKeyCode)a_kp.vkCode);
     }
     else
     {
         a_iks.KeyDown((WindowsInput.Native.VirtualKeyCode)a_kp.vkCode);
     }
 }
 public static string getLogMessage(keyboardPacket a_kp)
 {
     return(string.Format("패킷 키보드 : {0} {1}", a_kp.flags == globalKeyboardHook.FLAG_KEYDOWN ? "누름" : "풀림", a_kp.vkCode));
 }