internal KeybordCaptureEventArgs(w32.KBDLLHOOKSTRUCT keyData)
 {
     m_keyCode  = keyData.vkCode;
     m_scanCode = keyData.scanCode;
     m_flags    = keyData.flags;
     m_time     = keyData.time;
     m_cancel   = false;
 }
        static IntPtr HookProc(int nCode, IntPtr wParam, ref w32.KBDLLHOOKSTRUCT lParam)
        {
            bool cancel = false;

            if (nCode == HC_ACTION)
            {
                KeybordCaptureEventArgs ev = new KeybordCaptureEventArgs(lParam);
                switch (wParam.ToInt32())
                {
                case WM_KEYDOWN: if (KeyDown != null)
                    {
                        KeyDown(null, ev);
                    }
                    break;

                case WM_KEYUP: if (KeyUp != null)
                    {
                        KeyUp(null, ev);
                    }
                    break;

                case WM_SYSKEYDOWN: if (SysKeyDown != null)
                    {
                        SysKeyDown(null, ev);
                    }
                    break;

                case WM_SYSKEYUP: if (SysKeyUp != null)
                    {
                        SysKeyUp(null, ev);
                    }
                    break;
                }
                cancel = ev.Cancel;
            }
            return(cancel ? (IntPtr)1 : w32.CallNextHookEx(s_hook, nCode, wParam, ref lParam));
        }