在WPF中實現(xiàn)全局快捷鍵功能
更新時間:2022年06月29日 10:45:07 作者:天方
這篇文章介紹了在WPF中實現(xiàn)全局快捷鍵功能的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
今天寫一個小程序中使用到了全局快捷鍵,找到了我之前寫的文章在c#中使用全局快捷鍵翻了一下,發(fā)現(xiàn)它是WinForm版本的,而我現(xiàn)在大部分寫WPF程序了,便將其翻譯了為WPF版本的了。
static class Hotkey
{
#region 系統(tǒng)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">回調(diào)函數(shù)</param>
public static void Regist(Window window, HotkeyModifiers fsModifiers, Key key, HotKeyCallBackHanlder callBack)
{
var hwnd = new WindowInteropHelper(window).Handle;
var _hwndSource = HwndSource.FromHwnd(hwnd);
_hwndSource.AddHook(WndProc);
int id = keyid++;
var vk = KeyInterop.VirtualKeyFromKey(key);
if (!RegisterHotKey(hwnd, id, fsModifiers, (uint)vk))
throw new Exception("regist hotkey fail.");
keymap[id] = callBack;
}
/// <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">回調(diào)函數(shù)</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();
}
enum HotkeyModifiers
{
MOD_ALT = 0x1,
MOD_CONTROL = 0x2,
MOD_SHIFT = 0x4,
MOD_WIN = 0x8
}代碼仍然差不多,使用的方式更加簡單一點:
protected override void OnSourceInitialized(EventArgs e)
{
Hotkey.Regist(this, HotkeyModifiers.MOD_ALT, Key.T, () =>
{
MessageBox.Show("hello");
});
_context = new MainContext();
this.DataContext = _context;
_context.Process();
}需要注意的是,調(diào)用Hotkey.Regist函數(shù)時,需要窗口是分配了句柄的,因此建議在OnLoad事件或OnSourceInitialized函數(shù)中進行。
到此這篇關于在WPF中實現(xiàn)全局快捷鍵功能的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
基于WebClient實現(xiàn)Http協(xié)議的Post與Get對網(wǎng)站進行模擬登陸和瀏覽實例
這篇文章主要介紹了基于WebClient實現(xiàn)Http協(xié)議的Post與Get對網(wǎng)站進行模擬登陸和瀏覽的方法,以實例形式詳細分析了WebClient模擬POST與GET登陸與瀏覽的過程,對于C#項目開發(fā)來說具有不錯的參考借鑒價值,需要的朋友可以參考下2014-11-11

