diff --git a/Control/ConfigWindow.xaml.cs b/Control/ConfigWindow.xaml.cs index 61fe89f..a2d77a5 100644 --- a/Control/ConfigWindow.xaml.cs +++ b/Control/ConfigWindow.xaml.cs @@ -18,13 +18,15 @@ namespace GeekDesk.Control private static AboutControl about = new AboutControl(); private static ThemeControl theme = new ThemeControl(); private static MotionControl motion = new MotionControl(); + public MainWindow mainWindow; - public ConfigWindow(AppConfig appConfig) + public ConfigWindow(AppConfig appConfig, MainWindow mainWindow) { InitializeComponent(); this.DataContext = appConfig; RightCard.Content = about; this.Topmost = true; + this.mainWindow = mainWindow; } diff --git a/Control/UserControls/MotionControl.xaml b/Control/UserControls/MotionControl.xaml index 5b0f53d..d562835 100644 --- a/Control/UserControls/MotionControl.xaml +++ b/Control/UserControls/MotionControl.xaml @@ -60,9 +60,10 @@ VerticalAlignment="Top" IsReadOnly="True" IsReadOnlyCaretVisible="True" - Width="80" + Width="200" Text="{Binding HotkeyStr}" KeyDown="HotKeyDown" + KeyUp="HotKeyUp" Margin="12.967,-7.38,-12.967,0"/> diff --git a/Control/UserControls/MotionControl.xaml.cs b/Control/UserControls/MotionControl.xaml.cs index e31e92f..3698ceb 100644 --- a/Control/UserControls/MotionControl.xaml.cs +++ b/Control/UserControls/MotionControl.xaml.cs @@ -23,7 +23,8 @@ namespace GeekDesk.Control.UserControls /// public partial class MotionControl : UserControl { - private static bool controlKeyDown = false; + private static bool hotkeyFinished = true; //热键设置结束 + private static KeyEventArgs prevKeyTemp; //上一个按键 private static AppConfig appConfig = MainWindow.appData.AppConfig; public MotionControl() @@ -33,44 +34,190 @@ namespace GeekDesk.Control.UserControls /// - /// 热键按下 + /// 注册热键按下 /// /// /// private void HotKeyDown(object sender, KeyEventArgs e) { - if (e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Control) - || e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Windows) - || e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Alt) - || (e.Key >= Key.A && e.Key <= Key.Z)) + if (!e.IsRepeat) { - if (e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Control) - || e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Windows) - || e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Alt)) + if (hotkeyFinished) { - appConfig.HotkeyStr += GetKeyName(e); - } else if (appConfig.HotkeyStr.Length > 0 - && (e.Key >= Key.A && e.Key <= Key.Z)) + appConfig.Hotkey = 0; + appConfig.HotkeyStr = ""; + appConfig.HotkeyModifiers = 0; + hotkeyFinished = false; + } + //首次按下按键 + if (appConfig.HotkeyStr == null || appConfig.HotkeyStr.Length == 0) { - appConfig.HotkeyStr += e.Key.ToString(); + if (CheckModifierKeys(e)) + { + //辅助键 + appConfig.HotkeyStr = GetKeyName(e); + appConfig.HotkeyModifiers = GetModifierKeys(e); + prevKeyTemp = e; + } + } + else + { + //非首次按下 需要判断前一个键值是否为辅助键 + if (CheckModifierKeys(prevKeyTemp) + && ((e.Key >= Key.A && e.Key <= Key.Z) + || (e.Key >= Key.F1 && e.Key <= Key.F12) + || (e.Key >= Key.D0 && e.Key <= Key.D9))) + { + appConfig.Hotkey = e.Key; + appConfig.HotkeyStr += e.Key.ToString(); + prevKeyTemp = e; + } + else if (CheckModifierKeys(e)) + { + appConfig.HotkeyStr += GetKeyName(e); + appConfig.HotkeyModifiers |= GetModifierKeys(e); + prevKeyTemp = e; + } } } } private string GetKeyName(KeyEventArgs e) { - if (e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Control)) + Key key = e.Key; + if (key == Key.LeftCtrl || key == Key.RightCtrl) { return "Ctrl + "; - } else if (e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Windows)) + } else if (key == Key.LWin || key == Key.RWin) { return "Win + "; - } else if (e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Alt)) + } + else if (key == Key.LeftShift || key == Key.RightShift) + { + return "Shift + "; + } + else { return "Alt + "; } - return ""; + } + private HotkeyModifiers GetModifierKeys(KeyEventArgs e) + { + Key key = e.Key; + if (key == Key.LeftCtrl || key == Key.RightCtrl) + { + return HotkeyModifiers.MOD_CONTROL; + } + else if (key == Key.LWin || key == Key.RWin) + { + return HotkeyModifiers.MOD_WIN; + } + else if (key == Key.LeftShift || key == Key.RightShift) + { + return HotkeyModifiers.MOD_SHIFT; + } + else + { + return HotkeyModifiers.MOD_ALT; + } + } + + private bool CheckModifierKeys(KeyEventArgs e) + { + Key key = e.Key; + return key == Key.LeftCtrl || key == Key.RightCtrl + || key == Key.LWin || key == Key.RWin + || key == Key.LeftShift || key == Key.RightShift + || key == Key.LeftAlt || key == Key.RightAlt; + } + + + private void HotKeyUp(object sender, KeyEventArgs e) + { + hotkeyFinished = true; + ConfigWindow cw = (ConfigWindow)Window.GetWindow(this); + try + { + Hotkey.Regist(cw.mainWindow, appConfig.HotkeyModifiers, appConfig.Hotkey, () => + { + if (cw.mainWindow.Visibility == Visibility.Collapsed) + { + ShowApp(cw.mainWindow); + } + else + { + cw.mainWindow.Visibility = Visibility.Collapsed; + } + }); + } catch (Exception) + { + HandyControl.Controls.Growl.ErrorGlobal("热键注册失败,当前热键已被其它程序占用!"); + } + + } + + private void ShowApp(MainWindow mainWindow) + { + if (appConfig.FollowMouse) + { + ShowAppAndFollowMouse(mainWindow); + } + else + { + this.Visibility = Visibility.Visible; + } + Keyboard.Focus(this); + } + + /// + /// 随鼠标位置显示面板 (鼠标始终在中间) + /// + private void ShowAppAndFollowMouse(MainWindow mainWindow) + { + //获取鼠标位置 + System.Windows.Point p = MouseUtil.GetMousePosition(); + double left = SystemParameters.VirtualScreenLeft; + double top = SystemParameters.VirtualScreenTop; + double width = SystemParameters.VirtualScreenWidth; + double height = SystemParameters.VirtualScreenHeight; + double right = width - Math.Abs(left); + double bottom = height - Math.Abs(top); + + + if (p.X - mainWindow.Width / 2 < left) + { + //判断是否在最左边缘 + mainWindow.Left = left; + } + else if (p.X + mainWindow.Width / 2 > right) + { + //判断是否在最右边缘 + mainWindow.Left = right - mainWindow.Width; + } + else + { + mainWindow.Left = p.X - mainWindow.Width / 2; + } + + + if (p.Y - mainWindow.Height / 2 < top) + { + //判断是否在最上边缘 + mainWindow.Top = top; + } + else if (p.Y + mainWindow.Height / 2 > bottom) + { + //判断是否在最下边缘 + mainWindow.Top = bottom - mainWindow.Height; + } + else + { + mainWindow.Top = p.Y - mainWindow.Height / 2; + } + + mainWindow.Visibility = Visibility.Visible; + } } } diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 19eeaba..93acadd 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -137,50 +137,7 @@ namespace GeekDesk // appData.AppConfig.MenuCardWidth = LeftColumn.Width.Value; //} - /// - /// 随鼠标位置显示面板 (鼠标始终在中间) - /// - private void ShowAppAndFollowMouse() - { - //获取鼠标位置 - System.Windows.Point p = MouseUtil.GetMousePosition(); - double left = SystemParameters.VirtualScreenLeft; - double top = SystemParameters.VirtualScreenTop; - double width = SystemParameters.VirtualScreenWidth; - double height = SystemParameters.VirtualScreenHeight; - double right = width - Math.Abs(left); - double bottom = height - Math.Abs(top); - - - if (p.X - this.Width / 2 < left) - { - //判断是否在最左边缘 - this.Left = left; - } else if (p.X + this.Width / 2 > right) - { - //判断是否在最右边缘 - this.Left = right - this.Width; - } else - { - this.Left = p.X - this.Width / 2; - } - - - if (p.Y - this.Height / 2 < top) - { - //判断是否在最上边缘 - this.Top = top; - } else if (p.Y + this.Height/2 > bottom) - { - //判断是否在最下边缘 - this.Top = bottom - this.Height; - } else - { - this.Top = p.Y - this.Height / 2; - } - - this.Visibility = Visibility.Visible; - } + /// /// 右键任务栏图标 显示主面板 @@ -203,6 +160,56 @@ namespace GeekDesk Keyboard.Focus(this); } + /// + /// 随鼠标位置显示面板 (鼠标始终在中间) + /// + private void ShowAppAndFollowMouse() + { + //获取鼠标位置 + System.Windows.Point p = MouseUtil.GetMousePosition(); + double left = SystemParameters.VirtualScreenLeft; + double top = SystemParameters.VirtualScreenTop; + double width = SystemParameters.VirtualScreenWidth; + double height = SystemParameters.VirtualScreenHeight; + double right = width - Math.Abs(left); + double bottom = height - Math.Abs(top); + + + if (p.X - this.Width / 2 < left) + { + //判断是否在最左边缘 + this.Left = left; + } + else if (p.X + this.Width / 2 > right) + { + //判断是否在最右边缘 + this.Left = right - this.Width; + } + else + { + this.Left = p.X - this.Width / 2; + } + + + if (p.Y - this.Height / 2 < top) + { + //判断是否在最上边缘 + this.Top = top; + } + else if (p.Y + this.Height / 2 > bottom) + { + //判断是否在最下边缘 + this.Top = bottom - this.Height; + } + else + { + this.Top = p.Y - this.Height / 2; + } + + this.Visibility = Visibility.Visible; + } + + /// /// 图片图标单击事件 /// @@ -266,7 +273,7 @@ namespace GeekDesk private void ConfigButtonClick(object sender, RoutedEventArgs e) { //SettingMenu.IsOpen = true; - new ConfigWindow(appData.AppConfig).Show(); + new ConfigWindow(appData.AppConfig, this).Show(); } ///