Example #1
0
        private void PumpMessage()
        {
            var message = new APILibrary.Win32.Message();

            //peek message
            while (APILibrary.Win32.Internal.PeekMessage(out message, IntPtr.Zero, 0, 0,
                                                         (int)APILibrary.Win32.PeekMessageFlags.PM_REMOVE) == true)
            {
                //translate and dispatch message
                APILibrary.Win32.Internal.TranslateMessage(ref message);
                APILibrary.Win32.Internal.DispatchMessage(ref message);

                //catch and tranlate message
                CatchMessage(message);

                //quit, the window is not existed
                if (message.type == (uint)APILibrary.Win32.WinMsg.WM_QUIT)
                {
                    IsExisted = false;
                }
            }
        }
Example #2
0
        private void CatchMessage(APILibrary.Win32.Message message)
        {
            //get mouse position
            Position <int> mousePosition()
            {
                return(new Position <int>(
                           APILibrary.Win32.Message.GetXFromLparam(message.lParam),
                           APILibrary.Win32.Message.GetYFromLparam(message.lParam)));
            }

            //get mouse wheel scroll offset
            int mouseWheelScrollOffset()
            {
                return(APILibrary.Win32.Message.HighWord(message.wParam));
            }

            void lockCursor()
            {
                APILibrary.Win32.Internal.SetCapture(mHandle);

                var position   = new APILibrary.Win32.Point();
                var clientRect = new APILibrary.Win32.Rect();

                APILibrary.Win32.Internal.GetClipCursor(ref mLastClipRect);
                APILibrary.Win32.Internal.ClientToScreen(mHandle, ref position);
                APILibrary.Win32.Internal.GetClientRect(mHandle, ref clientRect);

                var lockRect = new APILibrary.Win32.Rect()
                {
                    left   = position.x,
                    top    = position.y,
                    right  = position.x + clientRect.right - clientRect.left,
                    bottom = position.y + clientRect.bottom - clientRect.top
                };

                APILibrary.Win32.Internal.ClipCursor(ref lockRect);
            }

            void unLockCursor()
            {
                APILibrary.Win32.Internal.ReleaseCapture();

                APILibrary.Win32.Internal.ClipCursor(ref mLastClipRect);
            }

            switch ((APILibrary.Win32.WinMsg)message.type)
            {
            //sender event
            case APILibrary.Win32.WinMsg.WM_KEYUP: SenderEvent(new KeyBoardEvent(DateTime.Now, (KeyCode)message.wParam, false)); break;

            case APILibrary.Win32.WinMsg.WM_KEYDOWN: SenderEvent(new KeyBoardEvent(DateTime.Now, (KeyCode)message.wParam, true)); break;

            case APILibrary.Win32.WinMsg.WM_MOUSEMOVE: SenderEvent(new MouseMoveEvent(DateTime.Now, mousePosition())); break;

            case APILibrary.Win32.WinMsg.WM_LBUTTONUP: unLockCursor();
                SenderEvent(new MouseClickEvent(DateTime.Now, mousePosition(), MouseButton.Left, false)); break;

            case APILibrary.Win32.WinMsg.WM_MBUTTONUP: unLockCursor();
                SenderEvent(new MouseClickEvent(DateTime.Now, mousePosition(), MouseButton.Middle, false)); break;

            case APILibrary.Win32.WinMsg.WM_RBUTTONUP: unLockCursor();
                SenderEvent(new MouseClickEvent(DateTime.Now, mousePosition(), MouseButton.Right, false)); break;

            case APILibrary.Win32.WinMsg.WM_MOUSEWHEEL: SenderEvent(new MouseWheelEvent(DateTime.Now, mousePosition(), mouseWheelScrollOffset())); break;

            case APILibrary.Win32.WinMsg.WM_LBUTTONDOWN: lockCursor();
                SenderEvent(new MouseClickEvent(DateTime.Now, mousePosition(), MouseButton.Left, true)); break;

            case APILibrary.Win32.WinMsg.WM_MBUTTONDOWN: lockCursor();
                SenderEvent(new MouseClickEvent(DateTime.Now, mousePosition(), MouseButton.Middle, true)); break;

            case APILibrary.Win32.WinMsg.WM_RBUTTONDOWN: lockCursor();
                SenderEvent(new MouseClickEvent(DateTime.Now, mousePosition(), MouseButton.Right, true)); break;

            default: break;
            }
        }