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.
///