热键注册及绑定
This commit is contained in:
@@ -18,13 +18,15 @@ namespace GeekDesk.Control
|
|||||||
private static AboutControl about = new AboutControl();
|
private static AboutControl about = new AboutControl();
|
||||||
private static ThemeControl theme = new ThemeControl();
|
private static ThemeControl theme = new ThemeControl();
|
||||||
private static MotionControl motion = new MotionControl();
|
private static MotionControl motion = new MotionControl();
|
||||||
|
public MainWindow mainWindow;
|
||||||
|
|
||||||
public ConfigWindow(AppConfig appConfig)
|
public ConfigWindow(AppConfig appConfig, MainWindow mainWindow)
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.DataContext = appConfig;
|
this.DataContext = appConfig;
|
||||||
RightCard.Content = about;
|
RightCard.Content = about;
|
||||||
this.Topmost = true;
|
this.Topmost = true;
|
||||||
|
this.mainWindow = mainWindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -60,9 +60,10 @@
|
|||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
IsReadOnly="True"
|
IsReadOnly="True"
|
||||||
IsReadOnlyCaretVisible="True"
|
IsReadOnlyCaretVisible="True"
|
||||||
Width="80"
|
Width="200"
|
||||||
Text="{Binding HotkeyStr}"
|
Text="{Binding HotkeyStr}"
|
||||||
KeyDown="HotKeyDown"
|
KeyDown="HotKeyDown"
|
||||||
|
KeyUp="HotKeyUp"
|
||||||
Margin="12.967,-7.38,-12.967,0"/>
|
Margin="12.967,-7.38,-12.967,0"/>
|
||||||
</hc:UniformSpacingPanel>
|
</hc:UniformSpacingPanel>
|
||||||
</hc:SimplePanel>
|
</hc:SimplePanel>
|
||||||
|
|||||||
@@ -23,7 +23,8 @@ namespace GeekDesk.Control.UserControls
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public partial class MotionControl : UserControl
|
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;
|
private static AppConfig appConfig = MainWindow.appData.AppConfig;
|
||||||
|
|
||||||
public MotionControl()
|
public MotionControl()
|
||||||
@@ -33,44 +34,190 @@ namespace GeekDesk.Control.UserControls
|
|||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 热键按下
|
/// 注册热键按下
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sender"></param>
|
/// <param name="sender"></param>
|
||||||
/// <param name="e"></param>
|
/// <param name="e"></param>
|
||||||
private void HotKeyDown(object sender, KeyEventArgs e)
|
private void HotKeyDown(object sender, KeyEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Control)
|
if (!e.IsRepeat)
|
||||||
|| e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Windows)
|
|
||||||
|| e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Alt)
|
|
||||||
|| (e.Key >= Key.A && e.Key <= Key.Z))
|
|
||||||
{
|
{
|
||||||
if (e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Control)
|
if (hotkeyFinished)
|
||||||
|| e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Windows)
|
|
||||||
|| e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Alt))
|
|
||||||
{
|
{
|
||||||
appConfig.HotkeyStr += GetKeyName(e);
|
appConfig.Hotkey = 0;
|
||||||
} else if (appConfig.HotkeyStr.Length > 0
|
appConfig.HotkeyStr = "";
|
||||||
&& (e.Key >= Key.A && e.Key <= Key.Z))
|
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)
|
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 + ";
|
return "Ctrl + ";
|
||||||
} else if (e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Windows))
|
} else if (key == Key.LWin || key == Key.RWin)
|
||||||
{
|
{
|
||||||
return "Win + ";
|
return "Win + ";
|
||||||
} else if (e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Alt))
|
}
|
||||||
|
else if (key == Key.LeftShift || key == Key.RightShift)
|
||||||
|
{
|
||||||
|
return "Shift + ";
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
return "Alt + ";
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 随鼠标位置显示面板 (鼠标始终在中间)
|
||||||
|
/// </summary>
|
||||||
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,50 +137,7 @@ namespace GeekDesk
|
|||||||
// appData.AppConfig.MenuCardWidth = LeftColumn.Width.Value;
|
// appData.AppConfig.MenuCardWidth = LeftColumn.Width.Value;
|
||||||
//}
|
//}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 随鼠标位置显示面板 (鼠标始终在中间)
|
|
||||||
/// </summary>
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 右键任务栏图标 显示主面板
|
/// 右键任务栏图标 显示主面板
|
||||||
@@ -203,6 +160,56 @@ namespace GeekDesk
|
|||||||
Keyboard.Focus(this);
|
Keyboard.Focus(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 随鼠标位置显示面板 (鼠标始终在中间)
|
||||||
|
/// </summary>
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 图片图标单击事件
|
/// 图片图标单击事件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -266,7 +273,7 @@ namespace GeekDesk
|
|||||||
private void ConfigButtonClick(object sender, RoutedEventArgs e)
|
private void ConfigButtonClick(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
//SettingMenu.IsOpen = true;
|
//SettingMenu.IsOpen = true;
|
||||||
new ConfigWindow(appData.AppConfig).Show();
|
new ConfigWindow(appData.AppConfig, this).Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user