public static extern bool TrackMouseEvent(ref TrackMouseEvent lpEventTrack);
        protected override IntPtr WindowProcedure(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
        {
            switch (message)
            {
                #region mouse

            case WindowMessage.MOUSEMOVE:
            {
                if (!_mouseTracking)
                {
                    var tme = new TrackMouseEvent(TrackMouseEventFlags.TME_LEAVE, Handle);
                    if (Functions.TrackMouseEvent(ref tme))
                    {
                        _mouseTracking = true;
                    }
                }
            }
            break;

            case WindowMessage.MOUSEACTIVATE:
                System.Diagnostics.Debug.WriteLine("MOUSEACTIVATE.");
                break;

            case WindowMessage.MOUSELEAVE:
                _mouseTracking = false;
                System.Diagnostics.Debug.WriteLine("MOUSELEAVE.");
                break;

            case WindowMessage.LBUTTONDOWN:
                //HasKeyboardFocus = true;
                System.Diagnostics.Debug.WriteLine("LBUTTONDOWN.");
                break;

                #endregion

                #region keyBoard

            case WindowMessage.KEYDOWN:
            case WindowMessage.SYSKEYDOWN:
                System.Diagnostics.Debug.WriteLine("KEYDOWN.");
                OnKeyDown(VirtualKeyToKeyTranslator.Translate((VirtualKey)wParam.ToInt32()));
                break;

            case WindowMessage.KEYUP:
            case WindowMessage.SYSKEYUP:
                System.Diagnostics.Debug.WriteLine("KEYUP.");
                OnKeyUp(VirtualKeyToKeyTranslator.Translate((VirtualKey)wParam.ToInt32()));
                break;

                #endregion

            case WindowMessage.SETFOCUS:
                System.Diagnostics.Debug.WriteLine("SETFOCUS.");
                break;

            case WindowMessage.KILLFOCUS:
                System.Diagnostics.Debug.WriteLine("KILLFOCUS.");
                break;

            case WindowMessage.ACTIVATE:
                System.Diagnostics.Debug.WriteLine("ACTIVATE.");
                break;

            case WindowMessage.ERASEBKGND:
                return(IntPtr.Zero);

                break;

            case WindowMessage.PAINT:
                Draw();
                break;

            case WindowMessage.WINDOWPOSCHANGING:
                break;

            case WindowMessage.CLOSE:
                Functions.DestroyWindow(Handle);
                break;

            case WindowMessage.DESTROY:
                Functions.PostQuitMessage(0);
                break;
            }

            return(Functions.DefWindowProc(handle, message, wParam, lParam));
        }