Skip to content
2 changes: 1 addition & 1 deletion samples/Plugin.Maui.KeyListener.Sample/MainPage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ void AddKeyboardBehavior()

void PrependOutput(string eventName, KeyPressedEventArgs e)
{
OutputLabel.Text = $"{eventName}: {e.Modifiers} {e.Keys} {e.KeyChar}" + Environment.NewLine + OutputLabel.Text;
OutputLabel.Text = $"{eventName}: {e.Modifiers} {e.Key} {e.KeyChar}" + Environment.NewLine + OutputLabel.Text;
}

void ClearButton_Clicked(object sender, EventArgs e)
Expand Down
2 changes: 1 addition & 1 deletion src/Plugin.Maui.KeyListener/KeyPressedEventArgs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ public sealed class KeyPressedEventArgs : EventArgs
{
public KeyboardModifiers Modifiers { get; internal set; }

public KeyboardKeys Keys { get; internal set; }
public KeyboardKeys Key { get; internal set; }

public char KeyChar { get; internal set; }

Expand Down
2 changes: 1 addition & 1 deletion src/Plugin.Maui.KeyListener/KeyboardBehavior.Android.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ void OnKeyPress(object? sender, Android.Views.View.KeyEventArgs e)

var args = new KeyPressedEventArgs
{
Keys = @event.KeyCode.ToKeyboardKeys(),
Key = @event.KeyCode.ToKeyboardKeys(),
Modifiers = KeyboardModifiersExtensions.ToKeyboardModifiers(@event.MetaState),
KeyChar = (char)@event.UnicodeChar
};
Expand Down
6 changes: 2 additions & 4 deletions src/Plugin.Maui.KeyListener/KeyboardBehavior.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,12 @@ namespace Plugin.Maui.KeyListener
{
public partial class KeyboardBehavior : PlatformBehavior<VisualElement>
{
KeyboardBehaviorTriggers _triggers;

public KeyboardBehaviorTriggers Triggers => _triggers ??= new KeyboardBehaviorTriggers();

public event EventHandler<KeyPressedEventArgs>? KeyDown;

public event EventHandler<KeyPressedEventArgs>? KeyUp;

internal void RaiseKeyDown(KeyPressedEventArgs args) => KeyDown?.Invoke(this, args);

internal void RaiseKeyUp(KeyPressedEventArgs args) => KeyUp?.Invoke(this, args);
}
}
5 changes: 2 additions & 3 deletions src/Plugin.Maui.KeyListener/KeyboardKeys.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ public enum KeyboardKeys
PrintScreen,
ScrollLock,
Pause,
Backquote,
Minus,
Plus,
Equals,
Backspace,
Tab,
Expand Down Expand Up @@ -104,10 +104,9 @@ public enum KeyboardKeys
NumPad8,
NumPad9,
Enter,
Plus,
GraveAccent,
Comma,
Period,
Slash,
NumPadDecimal
Application,
}
6 changes: 3 additions & 3 deletions src/Plugin.Maui.KeyListener/KeyboardKeysExtensions.Android.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ internal static partial class KeyboardKeysExtensions
KeyboardKeys.PrintScreen => Keycode.Sysrq,
KeyboardKeys.ScrollLock => Keycode.ScrollLock,
KeyboardKeys.Pause => Keycode.Break,
KeyboardKeys.Backquote => Keycode.Grave,
KeyboardKeys.Minus => Keycode.Minus,
KeyboardKeys.Equals => Keycode.Equals,
KeyboardKeys.Backspace => Keycode.Del,
Expand Down Expand Up @@ -113,7 +112,7 @@ internal static partial class KeyboardKeysExtensions
KeyboardKeys.Comma => Keycode.Comma,
KeyboardKeys.Period => Keycode.Period,
KeyboardKeys.Slash => Keycode.Slash,
KeyboardKeys.NumPadDecimal => Keycode.NumpadDot,
KeyboardKeys.Application => Keycode.Menu,
_ => Keycode.Unknown
};

Expand Down Expand Up @@ -171,7 +170,7 @@ internal static partial class KeyboardKeysExtensions
Keycode.Sysrq => KeyboardKeys.PrintScreen,
Keycode.ScrollLock => KeyboardKeys.ScrollLock,
Keycode.Break => KeyboardKeys.Pause,
Keycode.Grave => KeyboardKeys.Backquote,
Keycode.Grave => KeyboardKeys.GraveAccent,
Keycode.Minus => KeyboardKeys.Minus,
Keycode.Equals => KeyboardKeys.Equals,
Keycode.Del => KeyboardKeys.Backspace,
Expand Down Expand Up @@ -223,6 +222,7 @@ internal static partial class KeyboardKeysExtensions
Keycode.Comma => KeyboardKeys.Comma,
Keycode.Period => KeyboardKeys.Period,
Keycode.Slash => KeyboardKeys.Slash,
Keycode.Menu => KeyboardKeys.Application,
_ => KeyboardKeys.None
};
}
36 changes: 26 additions & 10 deletions src/Plugin.Maui.KeyListener/KeyboardKeysExtensions.Windows.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,9 @@ internal static partial class KeyboardKeysExtensions
KeyboardKeys.F10 => VirtualKey.F10,
KeyboardKeys.F11 => VirtualKey.F11,
KeyboardKeys.F12 => VirtualKey.F12,
KeyboardKeys.PrintScreen => VirtualKey.Print,
KeyboardKeys.PrintScreen => VirtualKey.Snapshot,
KeyboardKeys.ScrollLock => VirtualKey.Scroll,
KeyboardKeys.Pause => VirtualKey.Pause,
KeyboardKeys.Backquote => (VirtualKey)VIRTUAL_KEY.VK_OEM_3,
KeyboardKeys.Minus => VirtualKey.Subtract, // -
KeyboardKeys.Equals => VirtualKey.Add, // =
KeyboardKeys.Backspace => VirtualKey.Back,
Expand Down Expand Up @@ -119,8 +118,8 @@ internal static partial class KeyboardKeysExtensions
KeyboardKeys.GraveAccent => (VirtualKey)VIRTUAL_KEY.VK_OEM_3,
KeyboardKeys.Comma => (VirtualKey)VIRTUAL_KEY.VK_OEM_COMMA,
KeyboardKeys.Period => (VirtualKey)VIRTUAL_KEY.VK_OEM_PERIOD,
KeyboardKeys.Slash => VirtualKey.Divide,
KeyboardKeys.NumPadDecimal => VirtualKey.Delete,
KeyboardKeys.Slash => (VirtualKey)VIRTUAL_KEY.VK_OEM_2,
KeyboardKeys.Application => VirtualKey.Application,
_ => VirtualKey.None
};

Expand Down Expand Up @@ -176,12 +175,12 @@ internal static partial class KeyboardKeysExtensions
VirtualKey.F10 => KeyboardKeys.F10,
VirtualKey.F11 => KeyboardKeys.F11,
VirtualKey.F12 => KeyboardKeys.F12,
VirtualKey.Print => KeyboardKeys.PrintScreen,
VirtualKey.Snapshot => KeyboardKeys.PrintScreen,
VirtualKey.Scroll => KeyboardKeys.ScrollLock,
VirtualKey.Pause => KeyboardKeys.Pause,
(VirtualKey)VIRTUAL_KEY.VK_OEM_3 => KeyboardKeys.Backquote,
VirtualKey.Subtract => KeyboardKeys.Minus,
VirtualKey.Add => KeyboardKeys.Equals,
(VirtualKey)VIRTUAL_KEY.VK_OEM_3 => KeyboardKeys.GraveAccent,
(VirtualKey)VIRTUAL_KEY.VK_OEM_MINUS => KeyboardKeys.Minus,
(VirtualKey)VIRTUAL_KEY.VK_OEM_PLUS => KeyboardKeys.Equals, // VK_OEM_PLUS is the same as the Equals key
VirtualKey.Back => KeyboardKeys.Backspace,
VirtualKey.Tab => KeyboardKeys.Tab,
(VirtualKey)VIRTUAL_KEY.VK_OEM_4 => KeyboardKeys.LeftBracket,
Expand Down Expand Up @@ -213,6 +212,8 @@ internal static partial class KeyboardKeysExtensions
VirtualKey.NumberKeyLock => KeyboardKeys.NumLock,
VirtualKey.Divide => KeyboardKeys.NumPadDivide,
VirtualKey.Multiply => KeyboardKeys.NumPadMultiply,
VirtualKey.Subtract => KeyboardKeys.NumPadMinus,
VirtualKey.Add => KeyboardKeys.NumPadPlus,
VirtualKey.NumberPad0 => KeyboardKeys.NumPad0,
VirtualKey.NumberPad1 => KeyboardKeys.NumPad1,
VirtualKey.NumberPad2 => KeyboardKeys.NumPad2,
Expand All @@ -226,19 +227,34 @@ internal static partial class KeyboardKeysExtensions
VirtualKey.Decimal => KeyboardKeys.NumPadPeriod,
(VirtualKey)VIRTUAL_KEY.VK_OEM_COMMA => KeyboardKeys.Comma,
(VirtualKey)VIRTUAL_KEY.VK_OEM_PERIOD => KeyboardKeys.Period,
(VirtualKey)VIRTUAL_KEY.VK_OEM_2 => KeyboardKeys.Slash,
VirtualKey.Application => KeyboardKeys.Application,
_ => KeyboardKeys.None
};

static bool IsModifierKey(this VirtualKey key) => key is
VirtualKey.Shift or
VirtualKey.LeftShift or
VirtualKey.RightShift or
VirtualKey.Control or
VirtualKey.LeftControl or
VirtualKey.RightControl or
VirtualKey.Menu or
VirtualKey.LeftMenu or
VirtualKey.RightMenu or
VirtualKey.LeftWindows or
VirtualKey.RightWindows;

public static char ToChar(this VirtualKey key) => (char)Windows.Win32.PInvoke.MapVirtualKey((uint)key, MAP_VIRTUAL_KEY_TYPE.MAPVK_VK_TO_CHAR);

internal static KeyPressedEventArgs ToKeyPressedEventArgs(this KeyRoutedEventArgs e)
{
VirtualKeyModifiers virtualKeyModifiers = KeyboardModifiersExtensions.GetVirtualKeyModifiers();
var vk = (VirtualKey)Windows.Win32.PInvoke.MapVirtualKey(e.KeyStatus.ScanCode, MAP_VIRTUAL_KEY_TYPE.MAPVK_VSC_TO_VK_EX);
var vk = e.Key.IsModifierKey() ? (VirtualKey)Windows.Win32.PInvoke.MapVirtualKey(e.KeyStatus.ScanCode, MAP_VIRTUAL_KEY_TYPE.MAPVK_VSC_TO_VK_EX) : e.Key;
return new KeyPressedEventArgs
{
Modifiers = virtualKeyModifiers.ToKeyboardModifiers(),
Keys = vk.ToKeyboardKeys(),
Key = vk.ToKeyboardKeys(),
KeyChar = vk.ToChar(),
};
}
Expand Down
6 changes: 0 additions & 6 deletions src/Plugin.Maui.KeyListener/KeyboardKeysExtensions.cs

This file was deleted.

6 changes: 3 additions & 3 deletions src/Plugin.Maui.KeyListener/KeyboardKeysExtensions.iOS.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ internal static partial class KeyboardKeysExtensions
KeyboardKeys.PrintScreen => UIKeyboardHidUsage.KeyboardPrintScreen,
KeyboardKeys.ScrollLock => UIKeyboardHidUsage.KeyboardScrollLock,
KeyboardKeys.Pause => UIKeyboardHidUsage.KeyboardPause,
KeyboardKeys.Backquote => UIKeyboardHidUsage.KeyboardGraveAccentAndTilde,
KeyboardKeys.Minus => UIKeyboardHidUsage.KeyboardHyphen,
KeyboardKeys.Equals => UIKeyboardHidUsage.KeyboardEqualSign,
KeyboardKeys.Backspace => UIKeyboardHidUsage.KeyboardDeleteOrBackspace,
Expand Down Expand Up @@ -117,7 +116,7 @@ internal static partial class KeyboardKeysExtensions
KeyboardKeys.Comma => UIKeyboardHidUsage.KeyboardComma,
KeyboardKeys.Period => UIKeyboardHidUsage.KeyboardPeriod,
KeyboardKeys.Slash => UIKeyboardHidUsage.KeyboardSlash,
KeyboardKeys.NumPadDecimal => UIKeyboardHidUsage.KeypadPeriod,
KeyboardKeys.Application => UIKeyboardHidUsage.KeyboardApplication,
_ => 0
};

Expand Down Expand Up @@ -175,7 +174,7 @@ internal static partial class KeyboardKeysExtensions
UIKeyboardHidUsage.KeyboardPrintScreen => KeyboardKeys.PrintScreen,
UIKeyboardHidUsage.KeyboardScrollLock => KeyboardKeys.ScrollLock,
UIKeyboardHidUsage.KeyboardPause => KeyboardKeys.Pause,
UIKeyboardHidUsage.KeyboardGraveAccentAndTilde => KeyboardKeys.Backquote,
UIKeyboardHidUsage.KeyboardGraveAccentAndTilde => KeyboardKeys.GraveAccent,
UIKeyboardHidUsage.KeyboardHyphen => KeyboardKeys.Minus,
UIKeyboardHidUsage.KeyboardEqualSign => KeyboardKeys.Equals,
UIKeyboardHidUsage.KeyboardDeleteOrBackspace => KeyboardKeys.Backspace,
Expand Down Expand Up @@ -224,6 +223,7 @@ internal static partial class KeyboardKeysExtensions
UIKeyboardHidUsage.KeyboardComma => KeyboardKeys.Comma,
UIKeyboardHidUsage.KeyboardPeriod => KeyboardKeys.Period,
UIKeyboardHidUsage.KeyboardSlash => KeyboardKeys.Slash,
UIKeyboardHidUsage.KeyboardApplication => KeyboardKeys.Application,
_ => KeyboardKeys.None
};
}
Expand Down
12 changes: 12 additions & 0 deletions src/Plugin.Maui.KeyListener/KeyboardKeysMarkupExtension.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace Plugin.Maui.KeyListener;

[ContentProperty(nameof(Key))]
public sealed class KeyboardKeysMarkupExtension : IMarkupExtension
{
public string Key { get; set; }

Check warning on line 6 in src/Plugin.Maui.KeyListener/KeyboardKeysMarkupExtension.cs

View workflow job for this annotation

GitHub Actions / build-plugin-ci

Non-nullable property 'Key' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the property as nullable.

Check warning on line 6 in src/Plugin.Maui.KeyListener/KeyboardKeysMarkupExtension.cs

View workflow job for this annotation

GitHub Actions / build-plugin-ci

Non-nullable property 'Key' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the property as nullable.

Check warning on line 6 in src/Plugin.Maui.KeyListener/KeyboardKeysMarkupExtension.cs

View workflow job for this annotation

GitHub Actions / build-plugin-ci

Non-nullable property 'Key' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the property as nullable.

Check warning on line 6 in src/Plugin.Maui.KeyListener/KeyboardKeysMarkupExtension.cs

View workflow job for this annotation

GitHub Actions / build-sample-ci

Non-nullable property 'Key' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the property as nullable.

Check warning on line 6 in src/Plugin.Maui.KeyListener/KeyboardKeysMarkupExtension.cs

View workflow job for this annotation

GitHub Actions / build-sample-ci

Non-nullable property 'Key' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the property as nullable.

Check warning on line 6 in src/Plugin.Maui.KeyListener/KeyboardKeysMarkupExtension.cs

View workflow job for this annotation

GitHub Actions / build-sample-ci

Non-nullable property 'Key' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the property as nullable.

public object ProvideValue(IServiceProvider serviceProvider)
{
return Enum.TryParse(typeof(KeyboardKeys), Key, out var enumValue) ? enumValue : KeyboardKeys.None;
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
namespace Plugin.Maui.KeyListener;

[ContentProperty(nameof(Modifiers))]
public sealed class KeyboardModifiersExtension : IMarkupExtension
public sealed class KeyboardModifiersMarkupExtension : IMarkupExtension
{
public string Modifiers { get; set; }

Check warning on line 6 in src/Plugin.Maui.KeyListener/KeyboardModifiersMarkupExtension.cs

View workflow job for this annotation

GitHub Actions / build-plugin-ci

Non-nullable property 'Modifiers' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the property as nullable.

Check warning on line 6 in src/Plugin.Maui.KeyListener/KeyboardModifiersMarkupExtension.cs

View workflow job for this annotation

GitHub Actions / build-plugin-ci

Non-nullable property 'Modifiers' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the property as nullable.

Check warning on line 6 in src/Plugin.Maui.KeyListener/KeyboardModifiersMarkupExtension.cs

View workflow job for this annotation

GitHub Actions / build-sample-ci

Non-nullable property 'Modifiers' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the property as nullable.

Check warning on line 6 in src/Plugin.Maui.KeyListener/KeyboardModifiersMarkupExtension.cs

View workflow job for this annotation

GitHub Actions / build-sample-ci

Non-nullable property 'Modifiers' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the property as nullable.

Check warning on line 6 in src/Plugin.Maui.KeyListener/KeyboardModifiersMarkupExtension.cs

View workflow job for this annotation

GitHub Actions / build-sample-ci

Non-nullable property 'Modifiers' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the property as nullable.

public object ProvideValue(IServiceProvider serviceProvider)
{
Expand All @@ -24,14 +24,3 @@
return combinedFlag;
}
}

[ContentProperty(nameof(Keys))]
public sealed class KeyboardKeysExtension : IMarkupExtension
{
public string Keys { get; set; }

public object ProvideValue(IServiceProvider serviceProvider)
{
return Enum.TryParse(typeof(KeyboardKeys), Keys, out var enumValue) ? enumValue : KeyboardKeys.None;
}
}
4 changes: 2 additions & 2 deletions src/Plugin.Maui.KeyListener/KeyboardPageViewController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace Plugin.Maui.KeyListener
{
public class KeyboardPageViewController : PageViewController
internal sealed class KeyboardPageViewController : PageViewController
{
readonly List<WeakReference<KeyboardBehavior>> _keyboardBehaviors = new();

Expand Down Expand Up @@ -92,7 +92,7 @@ bool ProcessPresses(NSSet<UIPress> presses, UIPressesEvent evt, bool isKeyUp)
var eventArgs = new KeyPressedEventArgs
{
Modifiers = modifiers,
Keys = key.KeyCode.ToKeyboardKeys(),
Key = key.KeyCode.ToKeyboardKeys(),
KeyChar = characters.Length == 1 ? char.ToUpperInvariant(characters[0]) : default,
};

Expand Down
Loading