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); }
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); }