Esempio n. 1
0
        protected override unsafe void HandleSubclassWindowMessage(object sender, WMEventArgs e)
        {
            if (e.Message >= WM.KEYFIRST && e.Message <= WM.KEYLAST)
            {
                var key      = (Keys)e.WParam;
                var capsLock = Control.IsKeyLocked(Keys.CapsLock);
                var time     = User32.GetMessageTime();
                var chars    = Enumerable.Empty <char>();
                var keys     = Enumerable.Empty <Keys>();
                switch (e.Message)
                {
                case WM.KEYDOWN:
                case WM.SYSKEYDOWN:
                    keys = FKeyboardState.KeyCodes.Concat(new[] { key });
                    break;

                case WM.CHAR:
                case WM.SYSCHAR:
                    chars = new[] { (char)e.WParam };
                    keys  = FKeyboardState.KeyCodes;
                    break;

                case WM.KEYUP:
                case WM.SYSKEYUP:
                    keys = FKeyboardState.KeyCodes.Except(new[] { key });
                    break;
                }
                FKeyboardState = new KeyboardState(keys, chars, capsLock, time);
            }
        }
Esempio n. 2
0
        private IEnumerable <TouchNotification> GenerateTouchNotifications(WMEventArgs e)
        {
            var touchPointCount = e.WParam.LoWord();

            if (touchPointCount > 0)
            {
                var touchPoints = new TOUCHINPUT[touchPointCount];
                if (User32.GetTouchInputInfo(e.LParam, touchPointCount, touchPoints, Marshal.SizeOf(typeof(TOUCHINPUT))))
                {
                    e.Handled = true;

                    try
                    {
                        RECT cr;
                        if (User32.GetClientRect(e.HWnd, out cr))
                        {
                            foreach (var touchPoint in touchPoints)
                            {
                                var position = new Point(touchPoint.x / 100, touchPoint.y / 100);
                                User32.ScreenToClient(e.HWnd, ref position);
                                var clientArea  = new Size(cr.Width, cr.Height);
                                var id          = touchPoint.dwID;
                                var primary     = (touchPoint.dwFlags & Const.TOUCHEVENTF_PRIMARY) > 0;
                                var contactArea = (touchPoint.dwMask & Const.TOUCHINPUTMASKF_CONTACTAREA) > 0
                                    ? new Size(touchPoint.cxContact / 100, touchPoint.cyContact / 100)
                                    : Size.Empty;

                                if ((touchPoint.dwFlags & Const.TOUCHEVENTF_DOWN) > 0)
                                {
                                    yield return(new TouchDownNotification(position, clientArea, id, primary, contactArea, touchPoint.hSource.ToInt64()));
                                }
                                if ((touchPoint.dwFlags & Const.TOUCHEVENTF_MOVE) > 0)
                                {
                                    yield return(new TouchMoveNotification(position, clientArea, id, primary, contactArea, touchPoint.hSource.ToInt64()));
                                }
                                if ((touchPoint.dwFlags & Const.TOUCHEVENTF_UP) > 0)
                                {
                                    yield return(new TouchUpNotification(position, clientArea, id, primary, contactArea, touchPoint.hSource.ToInt64()));
                                }
                            }
                        }
                    }
                    finally
                    {
                        User32.CloseTouchInputHandle(e.LParam);
                    }
                }
            }
            yield break;
        }
Esempio n. 3
0
        protected override void HandleSubclassWindowMessage(object sender, WMEventArgs e)
        {
            if (e.Message >= WM.MOUSEFIRST && e.Message <= WM.MOUSELAST)
            {
                switch (e.Message)
                {
                case WM.MOUSEWHEEL:
                    unchecked
                    {
                        var wheel = e.WParam.ToInt32().HiWord();
                        FMouseWheel           += wheel;
                        FMouseState.MouseWheel = (int)Math.Round((float)FMouseWheel / Const.WHEEL_DELTA);
                    }
                    break;

                case WM.MOUSEMOVE:
                    RECT cr;
                    if (User32.GetClientRect(e.HWnd, out cr))
                    {
                        var pos    = e.LParam.ToInt32();
                        var x      = (int)pos.LoWord();
                        var y      = (int)pos.HiWord();
                        var width  = cr.Width;
                        var height = cr.Height;
                        FMouseState.X = 2d * x / (width - 1) - 1;
                        FMouseState.Y = 1d - 2d * y / (height - 1);
                    }
                    break;

                case WM.LBUTTONDOWN:
                case WM.LBUTTONDBLCLK:
                case WM.LBUTTONUP:
                case WM.MBUTTONDOWN:
                case WM.MBUTTONDBLCLK:
                case WM.MBUTTONUP:
                case WM.RBUTTONDOWN:
                case WM.RBUTTONDBLCLK:
                case WM.RBUTTONUP:
                case WM.XBUTTONDOWN:
                case WM.XBUTTONDBLCLK:
                case WM.XBUTTONUP:
                    FMouseState.Buttons = Control.MouseButtons;
                    break;
                }
            }
        }
Esempio n. 4
0
        private static WM ApplyTabHack(WMEventArgs a)
        {
            var msg         = a.Message;
            var filteredMsg = msg & (WM)0x01FF;

            switch (filteredMsg)
            {
            case WM.KEYDOWN:
            case WM.SYSKEYDOWN:
            case WM.CHAR:
            case WM.SYSCHAR:
            case WM.KEYUP:
            case WM.SYSKEYUP:
                // Check again that it's not the real message
                switch (msg)
                {
                case WM.KEYDOWN:
                case WM.SYSKEYDOWN:
                case WM.CHAR:
                case WM.SYSCHAR:
                case WM.KEYUP:
                case WM.SYSKEYUP:
                    break;

                default:
                    // Indeed the weired one - check for tab only
                    if ((Keys)a.WParam == Keys.Tab)
                    {
                        return(filteredMsg);
                    }
                    break;
                }
                break;
            }
            return(msg);
        }
Esempio n. 5
0
        private IEnumerable <GestureNotification> GenerateGestureNotifications(WMEventArgs e)
        {
            if (e.Message == WM.GESTURENOTIFY)
            {
                e.Handled = FEnabledIn[0];
                yield break;
            }
            else
            {
                var gestureInfo = new GESTUREINFO();
                gestureInfo.cbSize = FGestureInfoSize;
                if (User32.GetGestureInfo(e.LParam, ref gestureInfo))
                {
                    try
                    {
                        RECT cr;
                        if (User32.GetClientRect(e.HWnd, out cr))
                        {
                            var position = new Point(gestureInfo.x, gestureInfo.y);
                            User32.ScreenToClient(e.HWnd, ref position);

                            e.Handled = true;
                            switch ((GestureNotificationKind)gestureInfo.dwID)
                            {
                            case GestureNotificationKind.GestureBegin:
                                yield return(new GestureBeginNotification(position,
                                                                          new Size(cr.Width, cr.Height),
                                                                          gestureInfo.dwInstanceID,
                                                                          gestureInfo.dwSequenceID,
                                                                          gestureInfo.hwndTarget.ToInt64(),
                                                                          gestureInfo.dwFlags,
                                                                          gestureInfo.ullArguments,
                                                                          gestureInfo.cbExtraArgs));

                                break;

                            case GestureNotificationKind.GestureEnd:
                                yield return(new GestureEndNotification(position,
                                                                        new Size(cr.Width, cr.Height),
                                                                        gestureInfo.dwInstanceID,
                                                                        gestureInfo.dwSequenceID,
                                                                        gestureInfo.hwndTarget.ToInt64(),
                                                                        gestureInfo.dwFlags,
                                                                        gestureInfo.ullArguments,
                                                                        gestureInfo.cbExtraArgs));

                                break;

                            case GestureNotificationKind.GestureZoom:
                                yield return(new GestureZoomNotification(position,
                                                                         new Size(cr.Width, cr.Height),
                                                                         gestureInfo.dwInstanceID,
                                                                         gestureInfo.dwSequenceID,
                                                                         gestureInfo.hwndTarget.ToInt64(),
                                                                         gestureInfo.dwFlags,
                                                                         gestureInfo.ullArguments,
                                                                         gestureInfo.cbExtraArgs));

                                break;

                            case GestureNotificationKind.GesturePan:
                                yield return(new GesturePanNotification(position,
                                                                        new Size(cr.Width, cr.Height),
                                                                        gestureInfo.dwInstanceID,
                                                                        gestureInfo.dwSequenceID,
                                                                        gestureInfo.hwndTarget.ToInt64(),
                                                                        gestureInfo.dwFlags,
                                                                        gestureInfo.ullArguments,
                                                                        gestureInfo.cbExtraArgs));

                                break;

                            case GestureNotificationKind.GestureRotate:
                                yield return(new GestureRotateNotification(position,
                                                                           new Size(cr.Width, cr.Height),
                                                                           gestureInfo.dwInstanceID,
                                                                           gestureInfo.dwSequenceID,
                                                                           gestureInfo.hwndTarget.ToInt64(),
                                                                           gestureInfo.dwFlags,
                                                                           gestureInfo.ullArguments,
                                                                           gestureInfo.cbExtraArgs));

                                break;

                            case GestureNotificationKind.GesturePressAndTap:
                                yield return(new GesturePressAndTapNotification(position,
                                                                                new Size(cr.Width, cr.Height),
                                                                                gestureInfo.dwInstanceID,
                                                                                gestureInfo.dwSequenceID,
                                                                                gestureInfo.hwndTarget.ToInt64(),
                                                                                gestureInfo.dwFlags,
                                                                                gestureInfo.ullArguments,
                                                                                gestureInfo.cbExtraArgs));

                                break;

                            case GestureNotificationKind.GestureTwoFingerTap:
                                yield return(new GestureTwoFingerTapNotification(position,
                                                                                 new Size(cr.Width, cr.Height),
                                                                                 gestureInfo.dwInstanceID,
                                                                                 gestureInfo.dwSequenceID,
                                                                                 gestureInfo.hwndTarget.ToInt64(),
                                                                                 gestureInfo.dwFlags,
                                                                                 gestureInfo.ullArguments,
                                                                                 gestureInfo.cbExtraArgs));

                                break;

                            default:
                                yield break;
                            }
                        }
                    }
                    finally
                    {
                        e.Handled = false;
                    }
                }
                yield break;
            }
        }
Esempio n. 6
0
 protected abstract void HandleSubclassWindowMessage(object sender, WMEventArgs e);