/// <summary>
        /// キーボードフック終了
        /// </summary>
        public void Stop()
        {
            // 停止中ならそのまま終了
            if (!this.Active)
            {
                return;
            }

            // フックハンドル開放
            User32Lib.UnhookWindowsHookEx(this.mHookHandle);
            this.mHookHandle = IntPtr.Zero;

            return;
        }
        /// <summary>
        /// キーボードプロシージャ
        /// </summary>
        /// <param name="code">コード</param>
        /// <param name="wParam">WPARAM値</param>
        /// <param name="lParam">LPARAM値</param>
        /// <returns>戻り値</returns>
        private IntPtr KeyboardHookProc(int code, IntPtr wParam, IntPtr lParam)
        {
            if (code >= 0)
            {
                if (this.KeyHookEvent != null)
                {
                    int             evt_code = (int)wParam;
                    KBDLLHOOKSTRUCT param    = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
                    Keys            key      = (Keys)param.vkCode;

                    this.KeyHookEvent(this, new KeyHookEventArgs(evt_code, key));
                }
            }

            return(User32Lib.CallNextHookEx(this.mHookHandle, code, wParam, lParam));
        }
        /// <summary>
        /// キーボードフック開始
        /// </summary>
        public void Start()
        {
            // 動作中ならこれ以上動作させない
            if (this.Active)
            {
                return;
            }

            // フックハンドル取得
            this.mHookHandle =
                User32Lib.SetWindowsHookEx(WindowsHookType.WH_KEYBOARD_LL, KeyboardHookProc, GetInstance(), 0);

            // フック失敗用エラー表示
            if (this.mHookHandle == IntPtr.Zero)
            {
                Console.WriteLine("Last Error : 0x" + Kernel32Lib.GetLastError().ToString("x8"));
            }

            return;
        }