using GeekDesk.Constant;
using GeekDesk.MyThread;
using GeekDesk.Util;
using GeekDesk.ViewModel;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using static GeekDesk.Util.GlobalHotKey;
namespace GeekDesk.Control.UserControls.Config
{
///
/// 动作设置
///
public partial class MotionControl : UserControl
{
public static bool hotkeyFinished = true; //热键设置结束
private Key prevKeyTemp = Key.None; //上一个按键
private readonly List keysTemp = new List();//存储一次快捷键集合
private readonly AppConfig appConfig = MainWindow.appData.AppConfig;
public MotionControl()
{
InitializeComponent();
}
///
/// 注册热键按下
///
///
///
private void HotKeyDown(object sender, KeyEventArgs e)
{
HotKeyType hkType = (HotKeyType)(sender as TextBox).Tag;
Key downKey = e.Key;
if (downKey == Key.System)
{
downKey = e.SystemKey;
}
if (!CheckIsEnable(hkType)) return;
if (prevKeyTemp == Key.None || prevKeyTemp != downKey)
{
if (hotkeyFinished)
{
switch (hkType)
{
case HotKeyType.Main:
appConfig.Hotkey = 0;
appConfig.HotkeyStr = "";
appConfig.HotkeyModifiers = 0;
break;
case HotKeyType.ToDo:
appConfig.ToDoHotkey = 0;
appConfig.ToDoHotkeyStr = "";
appConfig.ToDoHotkeyModifiers = 0;
break;
case HotKeyType.ColorPicker:
appConfig.ColorPickerHotkey = 0;
appConfig.ColorPickerHotkeyStr = "";
appConfig.ColorPickerHotkeyModifiers = 0;
break;
}
hotkeyFinished = false;
}
//首次按下按键
if ((HotKeyType.Main == hkType && (appConfig.HotkeyStr == null || appConfig.HotkeyStr.Length == 0))
|| (HotKeyType.ToDo == hkType && (appConfig.ToDoHotkeyStr == null || appConfig.ToDoHotkeyStr.Length == 0))
|| (HotKeyType.ColorPicker == hkType && (appConfig.ColorPickerHotkeyStr == null || appConfig.ColorPickerHotkeyStr.Length == 0))
)
{
if (CheckModifierKeys(downKey))
{
//辅助键
switch (hkType)
{
case HotKeyType.Main:
appConfig.HotkeyStr = GetKeyName(downKey);
appConfig.HotkeyModifiers = GetModifierKeys(downKey);
break;
case HotKeyType.ToDo:
appConfig.ToDoHotkeyStr = GetKeyName(downKey);
appConfig.ToDoHotkeyModifiers = GetModifierKeys(downKey);
break;
case HotKeyType.ColorPicker:
appConfig.ColorPickerHotkeyStr = GetKeyName(downKey);
appConfig.ColorPickerHotkeyModifiers = GetModifierKeys(downKey);
break;
}
prevKeyTemp = downKey;
keysTemp.Add(e);
}
}
else
{
//非首次按下 需要判断前一个键值是否为辅助键
if (CheckModifierKeys(prevKeyTemp)
&& ((downKey >= Key.A && downKey <= Key.Z)
|| (downKey >= Key.F1 && downKey <= Key.F12)
|| (downKey >= Key.D0 && downKey <= Key.D9)))
{
switch (hkType)
{
case HotKeyType.Main:
appConfig.Hotkey = downKey;
appConfig.HotkeyStr += downKey.ToString();
break;
case HotKeyType.ToDo:
appConfig.ToDoHotkey = downKey;
appConfig.ToDoHotkeyStr += downKey.ToString();
break;
case HotKeyType.ColorPicker:
appConfig.ColorPickerHotkey = downKey;
appConfig.ColorPickerHotkeyStr += downKey.ToString();
break;
}
prevKeyTemp = downKey;
keysTemp.Add(e);
}
else if (CheckModifierKeys(downKey))
{
switch (hkType)
{
case HotKeyType.Main:
appConfig.HotkeyStr += GetKeyName(downKey);
appConfig.HotkeyModifiers |= GetModifierKeys(downKey);
break;
case HotKeyType.ToDo:
appConfig.ToDoHotkeyStr += GetKeyName(downKey);
appConfig.ToDoHotkeyModifiers |= GetModifierKeys(downKey);
break;
case HotKeyType.ColorPicker:
appConfig.ColorPickerHotkeyStr += GetKeyName(downKey);
appConfig.ColorPickerHotkeyModifiers |= GetModifierKeys(downKey);
break;
}
prevKeyTemp = downKey;
keysTemp.Add(e);
}
}
}
}
private string GetKeyName(Key key)
{
if (key == Key.LeftCtrl || key == Key.RightCtrl)
{
return "Ctrl + ";
}
else if (key == Key.LWin || key == Key.RWin)
{
return "Win + ";
}
else if (key == Key.LeftShift || key == Key.RightShift)
{
return "Shift + ";
}
else
{
return "Alt + ";
}
}
private HotkeyModifiers GetModifierKeys(Key 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(Key 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;
}
[MethodImpl(MethodImplOptions.Synchronized)]
private void HotKeyUp(object sender, KeyEventArgs e)
{
HotKeyType hkType = (HotKeyType)(sender as TextBox).Tag;
if (!CheckIsEnable(hkType)) return;
lock (this)
{
bool allKeyUp = true;
//判断所有键是否都松开
foreach (KeyEventArgs key in keysTemp)
{
if (key.KeyStates == KeyStates.Down)
{
allKeyUp = false;
break;
}
}
if (allKeyUp && !hotkeyFinished)
{
keysTemp.Clear();
prevKeyTemp = Key.None;
hotkeyFinished = true;
switch (hkType)
{
case HotKeyType.Main:
if (MainWindow.hotKeyId != -1)
{
//Hotkey.UnRegist(new WindowInteropHelper(MainWindow.mainWindow).Handle, Hotkey.keymap[MainWindow.hotKeyId]);
GlobalHotKey.Dispose(MainWindow.hotKeyId);
}
MainWindow.RegisterHotKey(false);
break;
case HotKeyType.ToDo:
if (MainWindow.toDoHotKeyId != -1)
{
//Hotkey.UnRegist(new WindowInteropHelper(MainWindow.toDoInfoWindow).Handle, Hotkey.keymap[MainWindow.toDoHotKeyId]);
GlobalHotKey.Dispose(MainWindow.toDoHotKeyId);
}
MainWindow.RegisterCreateToDoHotKey(false);
break;
case HotKeyType.ColorPicker:
if (MainWindow.colorPickerHotKeyId != -1)
{
//Hotkey.UnRegist(new WindowInteropHelper(MainWindow.toDoInfoWindow).Handle, Hotkey.keymap[MainWindow.toDoHotKeyId]);
GlobalHotKey.Dispose(MainWindow.colorPickerHotKeyId);
}
MainWindow.RegisterColorPickerHotKey(false);
break;
}
}
}
}
private bool CheckIsEnable(HotKeyType hkType)
{
switch (hkType)
{
case HotKeyType.Main:
return true == appConfig.EnableAppHotKey;
case HotKeyType.ToDo:
return true == appConfig.EnableTodoHotKey;
case HotKeyType.ColorPicker:
return true == appConfig.EnableColorPickerHotKey;
}
return false;
}
///
/// 移动窗口
///
///
///
private void DragMove(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Window.GetWindow(this).DragMove();
}
}
private void MarginHide_Changed(object sender, RoutedEventArgs e)
{
if (appConfig.MarginHide)
{
MarginHide.StartHide();
}
else
{
MarginHide.StopHide();
}
}
private void Animation_Checked(object sender, RoutedEventArgs e)
{
if (MainWindow.mainWindow.Visibility == Visibility.Collapsed)
{
MainWindow.mainWindow.Visibility = Visibility.Visible;
// 执行一下动画 防止太过突兀
MainWindow.FadeStoryBoard(0, (int)CommonEnum.WINDOW_ANIMATION_TIME, Visibility.Collapsed);
}
}
///
/// 鼠标中键呼出 change
///
///
///
private void MouseMiddle_Changed(object sender, RoutedEventArgs e)
{
if (appConfig.MouseMiddleShow)
{
MouseHookThread.MiddleHook();
}
else
{
MouseHookThread.Dispose();
}
}
///
/// 启用热键
///
///
///
private void EnableHotKey_Click(object sender, RoutedEventArgs e)
{
HotKeyType hkType = (HotKeyType)(sender as CheckBox).Tag;
switch (hkType)
{
case HotKeyType.Main:
if (true == appConfig.EnableAppHotKey)
MainWindow.RegisterHotKey(false);
break;
case HotKeyType.ToDo:
if (true == appConfig.EnableTodoHotKey)
MainWindow.RegisterCreateToDoHotKey(false);
break;
case HotKeyType.ColorPicker:
if (true == appConfig.EnableColorPickerHotKey)
MainWindow.RegisterColorPickerHotKey(false);
break;
}
}
}
}