89 lines
2.7 KiB
C#
89 lines
2.7 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Runtime.InteropServices;
|
|||
|
using System.Windows;
|
|||
|
using System.Windows.Input;
|
|||
|
using System.Windows.Interop;
|
|||
|
|
|||
|
namespace Ink_Canvas
|
|||
|
{
|
|||
|
static class Hotkey
|
|||
|
{
|
|||
|
#region 系统api
|
|||
|
[DllImport("user32.dll")]
|
|||
|
[return: MarshalAs(UnmanagedType.Bool)]
|
|||
|
static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, uint vk);
|
|||
|
|
|||
|
[DllImport("user32.dll")]
|
|||
|
static extern bool UnregisterHotKey(IntPtr hWnd, int id);
|
|||
|
#endregion
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 注册快捷键
|
|||
|
/// </summary>
|
|||
|
/// <param name="window">持有快捷键窗口</param>
|
|||
|
/// <param name="fsModifiers">组合键</param>
|
|||
|
/// <param name="key">快捷键</param>
|
|||
|
/// <param name="callBack">回调函数</param>
|
|||
|
public static bool Regist(Window window, HotkeyModifiers fsModifiers, Key key, HotKeyCallBackHanlder callBack)
|
|||
|
{
|
|||
|
var hwnd = new WindowInteropHelper(window).Handle;
|
|||
|
var _hwndSource = HwndSource.FromHwnd(hwnd);
|
|||
|
|
|||
|
if (keyid == 10)
|
|||
|
{
|
|||
|
_hwndSource.AddHook(WndProc);
|
|||
|
}
|
|||
|
|
|||
|
int id = keyid++;
|
|||
|
|
|||
|
var vk = KeyInterop.VirtualKeyFromKey(key);
|
|||
|
if (!RegisterHotKey(hwnd, id, fsModifiers, (uint)vk))
|
|||
|
{
|
|||
|
//throw new Exception("regist hotkey fail.");
|
|||
|
return false;
|
|||
|
}
|
|||
|
keymap[id] = callBack;
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 快捷键消息处理
|
|||
|
/// </summary>
|
|||
|
static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
|
|||
|
{
|
|||
|
if (msg == WM_HOTKEY)
|
|||
|
{
|
|||
|
int id = wParam.ToInt32();
|
|||
|
if (keymap.TryGetValue(id, out var callback))
|
|||
|
{
|
|||
|
callback();
|
|||
|
}
|
|||
|
}
|
|||
|
return IntPtr.Zero;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 注销快捷键
|
|||
|
/// </summary>
|
|||
|
/// <param name="hWnd">持有快捷键窗口的句柄</param>
|
|||
|
/// <param name="callBack">回调函数</param>
|
|||
|
public static void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)
|
|||
|
{
|
|||
|
foreach (KeyValuePair<int, HotKeyCallBackHanlder> var in keymap)
|
|||
|
{
|
|||
|
if (var.Value == callBack)
|
|||
|
UnregisterHotKey(hWnd, var.Key);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
const int WM_HOTKEY = 0x312;
|
|||
|
static int keyid = 10;
|
|||
|
static Dictionary<int, HotKeyCallBackHanlder> keymap = new Dictionary<int, HotKeyCallBackHanlder>();
|
|||
|
|
|||
|
public delegate void HotKeyCallBackHanlder();
|
|||
|
}
|
|||
|
|
|||
|
}
|