Forum Xamarin.Mac


The Xamarin Forums have officially moved to the new Microsoft Q&A experience. Microsoft Q&A is the home for technical questions and answers at across all products at Microsoft now including Xamarin!

To create new threads and ask questions head over to Microsoft Q&A for .NET and get involved today.

How do I get keyboard events in the topmost NSPanel?

Good day
This is my first post here. I am mainly C# developer, but did some coding in objective-c for ios in the past.

I have created an app using Xamarin and objective-c to help watching movies online. It shows the subtitles on top of all other windows.
This has been done using the NSPanel as it was the only way to make it work on MacOS Mojave. The app works great and made me really happy. Now I want to improve the app a bit and make NSPanel to respond to the keyboard events, so I can control the app using the keyboard to pause, play go backward or forward.

So, How do I get keyboard events in the topmost NSPanel? I tried to use this code:

NSEvent.AddLocalMonitorForEventsMatchingMask(NSEventMask.KeyDown, KeyboardEventHandler);

private static NSEvent KeyboardEventHandler(NSEvent keyEvent)
// handle key down events here

return (keyEvent);

and it only works when the app is not in the full-screen mode.

The full SubtitlesViewer-MACOS project can be found on github

Here is the part of the code that creates the panel.

    public override void ViewWillAppear()

        private void SetupView()
            var screenRes = screenResolution();
            int PANEL_HEIGHT = 200;
            subtitlesPanel = new NSPanel
                new CoreGraphics.CGRect(40, 50, screenRes.Width - 80, PANEL_HEIGHT),
                NSWindowStyle.Titled | NSWindowStyle.Closable | NSWindowStyle.Resizable | NSWindowStyle.Miniaturizable | NSWindowStyle.DocModal,
                NSBackingStore.Buffered, true
                BackgroundColor = NSColor.FromCalibratedRgba(0, 0, 0, 0.0f),
                ReleasedWhenClosed = true,
                HidesOnDeactivate = false,
                FloatingPanel = true,
                StyleMask = NSWindowStyle.NonactivatingPanel,
                Level = NSWindowLevel.MainMenu - 1,
                IsMovable = true,
                CollectionBehavior = NSWindowCollectionBehavior.CanJoinAllSpaces |


            subtitleTextButton = new NSButton(new CoreGraphics.CGRect(40, 0, screenRes.Width - 120, PANEL_HEIGHT-30))
                Title = "",
                WantsLayer = true

            subtitleTextButton.Layer.BackgroundColor = NSColor.Clear.CGColor;

            subtitleTextField = new NSTextField(new CoreGraphics.CGRect(40, 0, screenRes.Width - 120, PANEL_HEIGHT-30))
                Alignment = NSTextAlignment.Center
            subtitleTextField.Cell.Alignment = NSTextAlignment.Center;

            forwardButton = new NSButton(new CoreGraphics.CGRect(0, 0, 40, 30));
            forwardButton.Title = ">>";
            forwardButton.Activated += (object sender, EventArgs e) => {

            backButton = new NSButton(new CoreGraphics.CGRect(0, 30, 40, 30));
            backButton.Title = "<<";
            backButton.Activated += (object sender, EventArgs e) => {

            startStopButton = new NSButton(new CoreGraphics.CGRect(0, 60, 40, 30));
            startStopButton.Title = "Play";
            startStopButton.Activated += (object sender, EventArgs e) => {

            subtitlesPanel.ContentView.AddSubview(subtitleTextButton, NSWindowOrderingMode.Below, null);
            subtitlesPanel.ContentView.AddSubview(subtitleTextField, NSWindowOrderingMode.Below, null);

            subtitlesPanel.ContentView.AddSubview(forwardButton, NSWindowOrderingMode.Below, null);
            subtitlesPanel.ContentView.AddSubview(backButton, NSWindowOrderingMode.Below, null);
            subtitlesPanel.ContentView.AddSubview(startStopButton, NSWindowOrderingMode.Below, null);


Please kindly advice what else should I try to make it work.

Thank you

Wave Rider

Sign In or Register to comment.