From 2e219e66c990ccc687448dc10b77e1456be0e76d Mon Sep 17 00:00:00 2001 From: Stone_Red <56473591+Stone-Red-Code@users.noreply.github.com> Date: Tue, 30 Jun 2026 20:03:30 +0200 Subject: [PATCH] Add keyboard input support for plugins with key event handling --- src/DesktopMagic/Plugins/PluginWindow.xaml | 2 +- src/DesktopMagic/Plugins/PluginWindow.xaml.cs | 42 ++++- src/DesktopMagicPluginAPI/KeyEventArgs.cs | 46 +++++ src/DesktopMagicPluginAPI/Keys.cs | 160 ++++++++++++++++++ src/DesktopMagicPluginAPI/Plugin.cs | 16 ++ 5 files changed, 262 insertions(+), 4 deletions(-) create mode 100644 src/DesktopMagicPluginAPI/KeyEventArgs.cs create mode 100644 src/DesktopMagicPluginAPI/Keys.cs diff --git a/src/DesktopMagic/Plugins/PluginWindow.xaml b/src/DesktopMagic/Plugins/PluginWindow.xaml index b68b1ee..e02d548 100644 --- a/src/DesktopMagic/Plugins/PluginWindow.xaml +++ b/src/DesktopMagic/Plugins/PluginWindow.xaml @@ -26,7 +26,7 @@ - + diff --git a/src/DesktopMagic/Plugins/PluginWindow.xaml.cs b/src/DesktopMagic/Plugins/PluginWindow.xaml.cs index 03df7bc..abc9aaf 100644 --- a/src/DesktopMagic/Plugins/PluginWindow.xaml.cs +++ b/src/DesktopMagic/Plugins/PluginWindow.xaml.cs @@ -939,8 +939,10 @@ public partial class PluginWindow : Window, IPluginWindow tileBar.CaptionHeight = ActualHeight - 10; } - private void Window_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) + private void Image_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { + _ = image.Focus(); + ImageSource imageSource = image.Source; BitmapSource bitmapImage = (BitmapSource)imageSource; double pixelMousePositionX = e.GetPosition(image).X * bitmapImage.PixelWidth / image.ActualHeight; @@ -970,7 +972,7 @@ public partial class PluginWindow : Window, IPluginWindow pluginClassInstance?.OnMouseClick(point, mouseButton); } - private void Window_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) + private void Image_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) { ImageSource imageSource = image.Source; BitmapSource bitmapImage = (BitmapSource)imageSource; @@ -981,7 +983,7 @@ public partial class PluginWindow : Window, IPluginWindow pluginClassInstance?.OnMouseMove(point); } - private void Window_MouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e) + private void Image_MouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e) { ImageSource imageSource = image.Source; BitmapSource bitmapImage = (BitmapSource)imageSource; @@ -992,5 +994,39 @@ public partial class PluginWindow : Window, IPluginWindow pluginClassInstance?.OnMouseWheel(point, e.Delta); } + private void Image_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) + { + if (pluginClassInstance is null) + { + return; + } + + Keys key = (Keys)e.Key; + System.Windows.Input.ModifierKeys modifiers = e.KeyboardDevice.Modifiers; + bool alt = modifiers.HasFlag(System.Windows.Input.ModifierKeys.Alt); + bool control = modifiers.HasFlag(System.Windows.Input.ModifierKeys.Control); + bool shift = modifiers.HasFlag(System.Windows.Input.ModifierKeys.Shift); + bool windows = modifiers.HasFlag(System.Windows.Input.ModifierKeys.Windows); + + pluginClassInstance.OnKeyDown(new KeyEventArgs(key, alt, control, shift, windows)); + } + + private void Image_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) + { + if (pluginClassInstance is null) + { + return; + } + + Keys key = (Keys)e.Key; + System.Windows.Input.ModifierKeys modifiers = e.KeyboardDevice.Modifiers; + bool alt = modifiers.HasFlag(System.Windows.Input.ModifierKeys.Alt); + bool control = modifiers.HasFlag(System.Windows.Input.ModifierKeys.Control); + bool shift = modifiers.HasFlag(System.Windows.Input.ModifierKeys.Shift); + bool windows = modifiers.HasFlag(System.Windows.Input.ModifierKeys.Windows); + + pluginClassInstance.OnKeyUp(new KeyEventArgs(key, alt, control, shift, windows)); + } + #endregion Window Events } \ No newline at end of file diff --git a/src/DesktopMagicPluginAPI/KeyEventArgs.cs b/src/DesktopMagicPluginAPI/KeyEventArgs.cs new file mode 100644 index 0000000..8396e24 --- /dev/null +++ b/src/DesktopMagicPluginAPI/KeyEventArgs.cs @@ -0,0 +1,46 @@ +using System; + +namespace DesktopMagic.Api; + +/// +/// Provides data for keyboard events. +/// +public class KeyEventArgs : EventArgs +{ + /// + /// The key that was pressed or released. + /// + public Keys Key { get; } + + /// + /// Whether the Alt modifier was pressed. + /// + public bool Alt { get; } + + /// + /// Whether the Control modifier was pressed. + /// + public bool Control { get; } + + /// + /// Whether the Shift modifier was pressed. + /// + public bool Shift { get; } + + /// + /// Whether the Windows logo key was pressed. + /// + public bool Windows { get; } + + /// + /// Initializes a new instance of the class. + /// + public KeyEventArgs(Keys key, bool alt, bool control, bool shift, bool windows) + { + Key = key; + Alt = alt; + Control = control; + Shift = shift; + Windows = windows; + } +} diff --git a/src/DesktopMagicPluginAPI/Keys.cs b/src/DesktopMagicPluginAPI/Keys.cs new file mode 100644 index 0000000..1a33fac --- /dev/null +++ b/src/DesktopMagicPluginAPI/Keys.cs @@ -0,0 +1,160 @@ +#pragma warning disable CS1591 + +namespace DesktopMagic.Api; + +/// +/// Defines keyboard keys available for plugin input handling. +/// Values match System.Windows.Input.Key for direct casting. +/// +public enum Keys +{ + None = 0, + Cancel = 1, + Back = 2, + Tab = 3, + LineFeed = 4, + Clear = 5, + Return = 6, + Enter = 6, + ShiftKey = 16, + ControlKey = 17, + AltKey = 18, + Pause = 19, + CapsLock = 20, + Escape = 27, + Space = 32, + PageUp = 33, + PageDown = 34, + End = 35, + Home = 36, + Left = 37, + Up = 38, + Right = 39, + Down = 40, + Select = 41, + Print = 42, + Execute = 43, + PrintScreen = 44, + Insert = 45, + Delete = 46, + Help = 47, + D0 = 48, + D1 = 49, + D2 = 50, + D3 = 51, + D4 = 52, + D5 = 53, + D6 = 54, + D7 = 55, + D8 = 56, + D9 = 57, + A = 65, + B = 66, + C = 67, + D = 68, + E = 69, + F = 70, + G = 71, + H = 72, + I = 73, + J = 74, + K = 75, + L = 76, + M = 77, + N = 78, + O = 79, + P = 80, + Q = 81, + R = 82, + S = 83, + T = 84, + U = 85, + V = 86, + W = 87, + X = 88, + Y = 89, + Z = 90, + LWin = 91, + RWin = 92, + Apps = 93, + Sleep = 95, + NumPad0 = 96, + NumPad1 = 97, + NumPad2 = 98, + NumPad3 = 99, + NumPad4 = 100, + NumPad5 = 101, + NumPad6 = 102, + NumPad7 = 103, + NumPad8 = 104, + NumPad9 = 105, + Multiply = 106, + Add = 107, + Separator = 108, + Subtract = 109, + Decimal = 110, + Divide = 111, + F1 = 112, + F2 = 113, + F3 = 114, + F4 = 115, + F5 = 116, + F6 = 117, + F7 = 118, + F8 = 119, + F9 = 120, + F10 = 121, + F11 = 122, + F12 = 123, + F13 = 124, + F14 = 125, + F15 = 126, + F16 = 127, + F17 = 128, + F18 = 129, + F19 = 130, + F20 = 131, + F21 = 132, + F22 = 133, + F23 = 134, + F24 = 135, + NumLock = 144, + Scroll = 145, + LeftShift = 160, + RightShift = 161, + LeftCtrl = 162, + RightCtrl = 163, + LeftAlt = 164, + RightAlt = 165, + BrowserBack = 166, + BrowserForward = 167, + BrowserRefresh = 168, + BrowserStop = 169, + BrowserSearch = 170, + BrowserFavorites = 171, + BrowserHome = 172, + VolumeMute = 173, + VolumeDown = 174, + VolumeUp = 175, + MediaNextTrack = 176, + MediaPreviousTrack = 177, + MediaStop = 178, + MediaPlayPause = 179, + LaunchMail = 180, + SelectMedia = 181, + LaunchApplication1 = 182, + LaunchApplication2 = 183, + OemSemicolon = 186, + OemPlus = 187, + OemComma = 188, + OemMinus = 189, + OemPeriod = 190, + OemQuestion = 191, + OemTilde = 192, + OemOpenBrackets = 219, + OemPipe = 220, + OemCloseBrackets = 221, + OemQuotes = 222, + Oem8 = 223, + OemBackslash = 226, +} diff --git a/src/DesktopMagicPluginAPI/Plugin.cs b/src/DesktopMagicPluginAPI/Plugin.cs index 94cbb09..935199e 100644 --- a/src/DesktopMagicPluginAPI/Plugin.cs +++ b/src/DesktopMagicPluginAPI/Plugin.cs @@ -99,6 +99,22 @@ public abstract class Plugin { } + /// + /// Occurs when a key is pressed while the plugin window has keyboard focus. + /// + /// The key event data. + public virtual void OnKeyDown(KeyEventArgs e) + { + } + + /// + /// Occurs when a key is released while the plugin window has keyboard focus. + /// + /// The key event data. + public virtual void OnKeyUp(KeyEventArgs e) + { + } + /// /// Occurs when the application's theme has changed. ///