using GeekDesk.Control.Windows;
using GeekDesk.Util;
using GeekDesk.ViewModel;
using HandyControl.Data;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace GeekDesk.Control.UserControls.Config
{
///
/// 动作设置
///
public partial class MotionControl : UserControl
{
public static bool hotkeyFinished = true; //热键设置结束
private static KeyEventArgs prevKeyTemp; //上一个按键
private static List keysTemp = new List();//存储一次快捷键集合
private static AppConfig appConfig = MainWindow.appData.AppConfig;
public MotionControl()
{
InitializeComponent();
}
///
/// 注册热键按下
///
///
///
private void HotKeyDown(object sender, KeyEventArgs e)
{
string tag = (sender as TextBox).Tag.ToString();
bool main = false;
if ("Main".Equals(tag))
{
main = true;
}
if (!e.IsRepeat)
{
if (hotkeyFinished)
{
if (main)
{
appConfig.Hotkey = 0;
appConfig.HotkeyStr = "";
appConfig.HotkeyModifiers = 0;
} else
{
appConfig.ToDoHotkey = 0;
appConfig.ToDoHotkeyStr = "";
appConfig.ToDoHotkeyModifiers = 0;
}
hotkeyFinished = false;
}
//首次按下按键
if ((main && (appConfig.HotkeyStr == null || appConfig.HotkeyStr.Length == 0))
|| (!main && (appConfig.ToDoHotkeyStr == null || appConfig.ToDoHotkeyStr.Length == 0)))
{
if (CheckModifierKeys(e))
{
//辅助键
if (main)
{
appConfig.HotkeyStr = GetKeyName(e);
appConfig.HotkeyModifiers = GetModifierKeys(e);
} else
{
appConfig.ToDoHotkeyStr = GetKeyName(e);
appConfig.ToDoHotkeyModifiers = GetModifierKeys(e);
}
prevKeyTemp = e;
keysTemp.Add(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)))
{
if (main)
{
appConfig.Hotkey = e.Key;
appConfig.HotkeyStr += e.Key.ToString();
} else
{
appConfig.ToDoHotkey = e.Key;
appConfig.ToDoHotkeyStr += e.Key.ToString();
}
prevKeyTemp = e;
keysTemp.Add(e);
}
else if (CheckModifierKeys(e))
{
if (main)
{
appConfig.HotkeyStr += GetKeyName(e);
appConfig.HotkeyModifiers |= GetModifierKeys(e);
} else
{
appConfig.ToDoHotkeyStr += GetKeyName(e);
appConfig.ToDoHotkeyModifiers |= GetModifierKeys(e);
}
prevKeyTemp = e;
keysTemp.Add(e);
}
}
}
}
private string GetKeyName(KeyEventArgs e)
{
Key key = e.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(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;
}
[MethodImpl(MethodImplOptions.Synchronized)]
private void HotKeyUp(object sender, KeyEventArgs e)
{
string tag = (sender as TextBox).Tag.ToString();
bool main = false;
if ("Main".Equals(tag))
{
main = true;
}
lock(this)
{
bool allKeyUp = true;
//判断所有键是否都松开
foreach (KeyEventArgs key in keysTemp)
{
if (key.KeyStates == KeyStates.Down)
{
allKeyUp = false;
break;
}
}
if (allKeyUp && !hotkeyFinished)
{
keysTemp.Clear();
hotkeyFinished = true;
if (main)
{
if (MainWindow.hotKeyId != -1)
{
Hotkey.UnRegist(new WindowInteropHelper(MainWindow.mainWindow).Handle, Hotkey.keymap[MainWindow.hotKeyId]);
}
MainWindow.RegisterHotKey(false);
} else
{
if (MainWindow.toDoHotKeyId != -1)
{
Hotkey.UnRegist(new WindowInteropHelper(MainWindow.toDoInfoWindow).Handle, Hotkey.keymap[MainWindow.toDoHotKeyId]);
}
MainWindow.RegisterCreateToDoHotKey(false);
}
}
}
}
///
/// 移动窗口
///
///
///
private void DragMove(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Window.GetWindow(this).DragMove();
}
}
//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;
//}
}
}