Esempio n. 1
0
        /// <summary>
        /// Function to bind the input device.
        /// </summary>
        protected override void BindDevice()
        {
            if ((Exclusive) && (!_isExclusive))
            {
                _lastPosition = Cursor.Position;
                UpdateCursorPosition();
                _isExclusive = true;
            }

            if ((!Exclusive) && (_isExclusive))
            {
                _isExclusive = false;
                Position     = BoundControl.PointToClient(Point.Truncate(_lastPosition));
            }

            if (_isBound)
            {
                return;
            }

            UnbindDevice();

            if (_messageFilter != null)
            {
                _messageFilter.RawInputPointingDeviceData += GetRawData;
            }

            _device.UsagePage    = HIDUsagePage.Generic;
            _device.Usage        = (ushort)HIDUsage.Mouse;
            _device.Flags        = RawInputDeviceFlags.None;
            _device.WindowHandle = BoundControl.Handle;

            // Enable background access.
            if (AllowBackground)
            {
                _device.WindowHandle = BoundControl.Handle;
                _device.Flags       |= RawInputDeviceFlags.InputSink;
            }

            // Attempt to register the device.
            if (!Win32API.RegisterRawInputDevices(_device))
            {
                throw new GorgonException(GorgonResult.DriverError, Resources.GORINP_RAW_CANNOT_BIND_POINTING_DEVICE);
            }

            if (!Exclusive)
            {
                BoundControl.MouseLeave += BoundControl_MouseLeave;
            }

            _isBound = true;
        }
Esempio n. 2
0
        /// <summary>
        /// Function to retrieve and parse the raw pointing device data.
        /// </summary>
        /// <param name="sender">Sender of the event.</param>
        /// <param name="e">Event data to examine.</param>
        private void GetRawData(object sender, RawInputPointingDeviceEventArgs e)
        {
            if ((BoundControl == null) || (BoundControl.Disposing))
            {
                return;
            }

            if ((_deviceHandle != IntPtr.Zero) && (_deviceHandle != e.Handle))
            {
                return;
            }

            if ((Exclusive) && (!Acquired))
            {
                // Attempt to recapture.
                if (BoundControl.Focused)
                {
                    Acquired = true;
                }
                else
                {
                    return;
                }
            }

            // Do nothing if we're outside and we have exclusive mode turned off.
            if (!Exclusive)
            {
                Point clientPosition = BoundControl.PointToClient(Cursor.Position);

                if (!WindowRectangle.Contains(clientPosition))
                {
                    _outside = true;
                    return;
                }

                if (_outside)
                {
                    // If we're back inside place position at the entry point.
                    _outside = false;
                    Position = clientPosition;
                }
            }

            // Get wheel data.
            if ((e.PointingDeviceData.ButtonFlags & RawMouseButtons.MouseWheel) != 0)
            {
                OnPointingDeviceWheelMove((short)e.PointingDeviceData.ButtonData);
            }

            // If we're outside of the delay, then restart double click cycle.
            if (_doubleClicker.Milliseconds > DoubleClickDelay)
            {
                _doubleClicker.Reset();
                _clickCount = 0;
            }

            // Get button data.
            if ((e.PointingDeviceData.ButtonFlags & RawMouseButtons.LeftDown) != 0)
            {
                BeginDoubleClick(PointingDeviceButtons.Left);
                OnPointingDeviceDown(PointingDeviceButtons.Left);
            }

            if ((e.PointingDeviceData.ButtonFlags & RawMouseButtons.RightDown) != 0)
            {
                BeginDoubleClick(PointingDeviceButtons.Right);
                OnPointingDeviceDown(PointingDeviceButtons.Right);
            }

            if ((e.PointingDeviceData.ButtonFlags & RawMouseButtons.MiddleDown) != 0)
            {
                BeginDoubleClick(PointingDeviceButtons.Middle);
                OnPointingDeviceDown(PointingDeviceButtons.Middle);
            }

            if ((e.PointingDeviceData.ButtonFlags & RawMouseButtons.Button4Down) != 0)
            {
                BeginDoubleClick(PointingDeviceButtons.Button4);
                OnPointingDeviceDown(PointingDeviceButtons.Button4);
            }

            if ((e.PointingDeviceData.ButtonFlags & RawMouseButtons.Button5Down) != 0)
            {
                BeginDoubleClick(PointingDeviceButtons.Button5);
                OnPointingDeviceDown(PointingDeviceButtons.Button5);
            }

            // If we have an 'up' event on the buttons, remove the flag.
            if ((e.PointingDeviceData.ButtonFlags & RawMouseButtons.LeftUp) != 0)
            {
                if (IsDoubleClick(PointingDeviceButtons.Left))
                {
                    _clickCount += 1;
                }
                else
                {
                    _doubleClicker.Reset();
                    _clickCount = 0;
                }

                OnPointingDeviceUp(PointingDeviceButtons.Left, _clickCount);
            }

            if ((e.PointingDeviceData.ButtonFlags & RawMouseButtons.RightUp) != 0)
            {
                if (IsDoubleClick(PointingDeviceButtons.Right))
                {
                    _clickCount += 1;
                }
                else
                {
                    _doubleClicker.Reset();
                    _clickCount = 0;
                }

                OnPointingDeviceUp(PointingDeviceButtons.Right, _clickCount);
            }

            if ((e.PointingDeviceData.ButtonFlags & RawMouseButtons.MiddleUp) != 0)
            {
                if (IsDoubleClick(PointingDeviceButtons.Middle))
                {
                    _clickCount += 1;
                }
                else
                {
                    _doubleClicker.Reset();
                    _clickCount = 0;
                }

                OnPointingDeviceUp(PointingDeviceButtons.Middle, _clickCount);
            }

            if ((e.PointingDeviceData.ButtonFlags & RawMouseButtons.Button4Up) != 0)
            {
                if (IsDoubleClick(PointingDeviceButtons.Button4))
                {
                    _clickCount += 1;
                }
                else
                {
                    _doubleClicker.Reset();
                    _clickCount = 0;
                }

                OnPointingDeviceUp(PointingDeviceButtons.Button4, _clickCount);
            }

            if ((e.PointingDeviceData.ButtonFlags & RawMouseButtons.Button5Up) != 0)
            {
                if (IsDoubleClick(PointingDeviceButtons.Button5))
                {
                    _clickCount += 1;
                }
                else
                {
                    _doubleClicker.Reset();
                    _clickCount = 0;
                }

                OnPointingDeviceUp(PointingDeviceButtons.Button5, _clickCount);
            }

            // Fire events.
            RelativePosition = new PointF(RelativePosition.X + e.PointingDeviceData.LastX, RelativePosition.Y + e.PointingDeviceData.LastY);
            OnPointingDeviceMove(new PointF(Position.X + e.PointingDeviceData.LastX, Position.Y + e.PointingDeviceData.LastY),
                                 false);
            UpdateCursorPosition();
        }