C#注册快捷键

发布时间 2023-11-20 14:26:35作者: 逍遥岚轩
#region 系统api
// 注册快捷键
private IntPtr _hWnd = IntPtr.Zero;
private readonly int _hotkeyID = 0x666;
private const int WM_HOTKEY = 0x312;

[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);

private Window _fullScreenWindow;

#endregion

private void FullScreenWindow_Loaded(object sender, RoutedEventArgs e)
{
    // 注册快捷键
	_hWnd = new WindowInteropHelper(_fullScreenWindow).Handle;
	var hwndSource = HwndSource.FromHwnd(_hWnd);
	hwndSource.AddHook(WndProc);
	var vk = KeyInterop.VirtualKeyFromKey(Key.F11);
	if (!RegisterHotKey(_hWnd, _hotkeyID, HotkeyModifiers.NoRepeat, (uint)vk))
	{
    	throw new Exception("注册快捷键“F11”失败");
	}
}

#region 注册快捷键回调

/// <summary>
/// 快捷键消息处理
/// </summary>
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
	if (msg == WM_HOTKEY)
	{
		int id = wParam.ToInt32();
		if (id == _hotkeyID)
		{
			_fullScreenWindow.DialogResult = true;
		}
	}
	return IntPtr.Zero;
}

#endregion

#region 类型定义

[Flags]
enum HotkeyModifiers
{
    MOD_ALT = 0x1,
    MOD_CONTROL = 0x2,
    MOD_SHIFT = 0x4,
    MOD_WIN = 0x8,
    NoRepeat = 0x4000
}
#endregion