Ejemplo n.º 1
0
        public override void SendKeyUp(Key key)
        {
            KeyboardState.SetKeyState(key, false);
            var osxkey = MacOSKeyMap.GetKey(key);

            //just testing if I can do a key conversion here
            if (key == Key.WinRight)
            {
                osxkey = MacOSKeyCode.Fn;
            }

            var          e     = CG.CGEventCreateKeyboardEvent(IntPtr.Zero, (ushort)osxkey, false);
            CGEventFlags flags = BuildFlags(e);

            CG.CGEventSetFlags(e, flags);
            CG.CGEventPost(CGEventTapLocation.HIDEventTap, e);
            CF.CFRelease(e);
        }
Ejemplo n.º 2
0
        private IntPtr EventProc(IntPtr proxy, CGEventType type, IntPtr @event, IntPtr refcon)
        {
            if (type == CGEventType.KeyDown)
            {
                var code = CG.EventGetIntegerValueField(@event, CGEventField.KeyboardEventKeycode);
                if (!Enum.IsDefined(typeof(MacOSKeyCode), code))
                {
                    Console.WriteLine("THIS KEY IS NOT DEFINED!!!");
                    return(@event);
                }

                var key = MacOSKeyMap.GetKey((MacOSKeyCode)code);
                OnKeyDown(key);
                return(KeyDownArgs.Handled ? IntPtr.Zero : @event);
            }
            if (type == CGEventType.KeyUp)
            {
                var code = CG.EventGetIntegerValueField(@event, CGEventField.KeyboardEventKeycode);
                if (!Enum.IsDefined(typeof(MacOSKeyCode), code))
                {
                    Console.WriteLine("THIS KEY IS NOT DEFINED!!!");
                    return(@event);
                }

                var key = MacOSKeyMap.GetKey((MacOSKeyCode)code);
                OnKeyUp(key);
                return(KeyUpArgs.Handled ? IntPtr.Zero : @event);
            }
            if (type == CGEventType.FlagsChanged) //this may be important for persistent effects. like a caps lock key press will return a keydown, and not immediately a keyup. This is likely relevant so we can track caps state.
            //will likely need to sync caps state across clients. How can we enable OSX LED light??
            //TODO: caps lock sync and led
            {
                var code = CG.EventGetIntegerValueField(@event, CGEventField.KeyboardEventKeycode);
                if (!Enum.IsDefined(typeof(MacOSKeyCode), code))
                {
                    Console.WriteLine("THIS KEY IS NOT DEFINED!!!");
                    return(@event);
                }
                // Console.WriteLine(code);
            }

            if (type == CGEventType.MouseMoved)
            {
                //using the mouse point here messes us up because of the warp command and inability to cancel mouse
                //move events.
                //var pt = _getMousePoint();
                var deltaX = CG.EventGetIntegerValueField(@event, CGEventField.MouseEventDeltaX);
                var deltaY = CG.EventGetIntegerValueField(@event, CGEventField.MouseEventDeltaY);

                var newX = (int)ClientState._lastPositionX + deltaX;
                var newY = (int)ClientState._lastPositionY + deltaY;
                //OSX won't let me handle these events, so I instead post an additional move the event tap. Ignore these
                if (_ignoreNextMovement)
                {
                    _ignoreNextMovement = false;

                    return(@event);
                }


                this.OnMouseMove(newX, newY);

                return(MouseMoveArgs.Handled ? IntPtr.Zero : @event);
            }

            if (type == CGEventType.LeftMouseDown)
            {
                this.OnMouseDown(MouseButton.Left);
                return(MouseDownArgs.Handled ? IntPtr.Zero : @event);
            }
            if (type == CGEventType.RightMouseDown)
            {
                this.OnMouseDown(MouseButton.Right);
                return(MouseDownArgs.Handled ? IntPtr.Zero : @event);
            }
            if (type == CGEventType.OtherMouseDown)
            {
                var btn = CG.EventGetIntegerValueField(@event, CGEventField.MouseEventButtonNumber);
                if (btn == 2)
                {
                    this.OnMouseDown(MouseButton.Middle);
                    return(MouseDownArgs.Handled ? IntPtr.Zero : @event);
                }
                if (btn == 3)
                {
                    this.OnMouseDown(MouseButton.Button1);
                    return(MouseDownArgs.Handled ? IntPtr.Zero : @event);
                }
                if (btn == 4)
                {
                    this.OnMouseDown(MouseButton.Button2);
                    return(MouseDownArgs.Handled ? IntPtr.Zero : @event);
                }

                return(@event);
            }
            if (type == CGEventType.LeftMouseUp)
            {
                this.OnMouseUp(MouseButton.Left);
                return(MouseUpArgs.Handled ? IntPtr.Zero : @event);
            }
            if (type == CGEventType.RightMouseUp)
            {
                this.OnMouseUp(MouseButton.Right);
                return(MouseUpArgs.Handled ? IntPtr.Zero : @event);
            }
            if (type == CGEventType.OtherMouseUp)
            {
                var btn = CG.EventGetIntegerValueField(@event, CGEventField.MouseEventButtonNumber);
                if (btn == 2)
                {
                    this.OnMouseUp(MouseButton.Middle);
                    return(MouseUpArgs.Handled ? IntPtr.Zero : @event);
                }
                if (btn == 3)
                {
                    this.OnMouseUp(MouseButton.Button1);
                    return(MouseUpArgs.Handled ? IntPtr.Zero : @event);
                }
                if (btn == 4)
                {
                    this.OnMouseUp(MouseButton.Button2);
                    return(MouseUpArgs.Handled ? IntPtr.Zero : @event);
                }

                return(@event);
            }

            if (type == CGEventType.ScrollWheel)
            {
                var wheelDeltaY = CG.EventGetIntegerValueField(@event, CGEventField.ScrollWheelEventDeltaAxis1);
                var wheelDeltaX = CG.EventGetIntegerValueField(@event, CGEventField.ScrollWheelEventDeltaAxis2);

                this.OnMouseWheel(wheelDeltaX, wheelDeltaY);
                return(MouseWheelArgs.Handled ? IntPtr.Zero : @event);
            }


            return(@event);
        }