#if WINDOWS using Microsoft.UI.Xaml.Input; using Windows.System; #endif namespace CommanderApp.Services; public class KeyboardService : IKeyboardService { public event EventHandler KeyPressed; public void SetupKeyboardHandling(ContentPage page) { #if WINDOWS SetupWindowsKeyboardHandling(page); #elif MACCATALYST SetupMacKeyboardHandling(page); #endif } #if WINDOWS private void SetupWindowsKeyboardHandling(ContentPage page) { try { if (page.Handler?.PlatformView is Microsoft.UI.Xaml.FrameworkElement frameworkElement) { frameworkElement.KeyDown += OnWindowsKeyDown; } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"Windows keyboard setup error: {ex.Message}"); } } private void OnWindowsKeyDown(object sender, KeyRoutedEventArgs e) { var key = e.Key switch { VirtualKey.W => "w", VirtualKey.S => "s", VirtualKey.A => "a", VirtualKey.D => "d", VirtualKey.Space => " ", VirtualKey.Enter => "enter", VirtualKey.F5 => "f5", VirtualKey.F6 => "f6", VirtualKey.F7 => "f7", VirtualKey.F8 => "f8", VirtualKey.F10 => "f10", VirtualKey.H => "h", _ => null }; if (key != null) { KeyPressed?.Invoke(this, new KeyPressedEventArgs { Key = key, Platform = "Windows" }); e.Handled = true; } } #endif #if MACCATALYST private void SetupMacKeyboardHandling(ContentPage page) { try { if (page.Handler?.PlatformView is UIKit.UIView uiView) { var keyHandler = new MacKeyHandler(OnMacKeyPressed); keyHandler.Frame = uiView.Bounds; keyHandler.AutoresizingMask = UIKit.UIViewAutoresizing.All; uiView.AddSubview(keyHandler); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"Mac keyboard setup error: {ex.Message}"); } } private void OnMacKeyPressed(string key) { KeyPressed?.Invoke(this, new KeyPressedEventArgs { Key = key, Platform = "Mac" }); } public class MacKeyHandler : UIKit.UIView { private readonly Action _keyHandler; public MacKeyHandler(Action keyHandler) { _keyHandler = keyHandler; this.BecomeFirstResponder(); } public override bool CanBecomeFirstResponder => true; public override UIKit.UIKeyCommand[] KeyCommands => new[] { UIKit.UIKeyCommand.Create((Foundation.NSString)"w", (UIKit.UIKeyModifierFlags)0, new ObjCRuntime.Selector("handleW:")), UIKit.UIKeyCommand.Create((Foundation.NSString)"s", (UIKit.UIKeyModifierFlags)0, new ObjCRuntime.Selector("handleS:")), UIKit.UIKeyCommand.Create((Foundation.NSString)"a", (UIKit.UIKeyModifierFlags)0, new ObjCRuntime.Selector("handleA:")), UIKit.UIKeyCommand.Create((Foundation.NSString)"d", (UIKit.UIKeyModifierFlags)0, new ObjCRuntime.Selector("handleD:")), UIKit.UIKeyCommand.Create((Foundation.NSString)" ", (UIKit.UIKeyModifierFlags)0, new ObjCRuntime.Selector("handleSpace:")), UIKit.UIKeyCommand.Create((Foundation.NSString)"h", (UIKit.UIKeyModifierFlags)0, new ObjCRuntime.Selector("handleH:")) }; [Foundation.Export("handleW:")] void HandleW(UIKit.UIKeyCommand cmd) => _keyHandler?.Invoke("w"); [Foundation.Export("handleS:")] void HandleS(UIKit.UIKeyCommand cmd) => _keyHandler?.Invoke("s"); [Foundation.Export("handleA:")] void HandleA(UIKit.UIKeyCommand cmd) => _keyHandler?.Invoke("a"); [Foundation.Export("handleD:")] void HandleD(UIKit.UIKeyCommand cmd) => _keyHandler?.Invoke("d"); [Foundation.Export("handleSpace:")] void HandleSpace(UIKit.UIKeyCommand cmd) => _keyHandler?.Invoke(" "); [Foundation.Export("handleH:")] void HandleH(UIKit.UIKeyCommand cmd) => _keyHandler?.Invoke("h"); } #endif }