最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在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">回調函數(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">回調函數(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();
}

需要注意的是,調用Hotkey.Regist函數(shù)時,需要窗口是分配了句柄的,因此建議在OnLoad事件或OnSourceInitialized函數(shù)中進行。

到此這篇關于在WPF中實現(xiàn)全局快捷鍵功能的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C# 文件拖拽和pixturBox縮放與拖拽功能

    C# 文件拖拽和pixturBox縮放與拖拽功能

    這篇文章主要介紹了C# 文件拖拽和pixturBox縮放與拖拽功能,代碼簡單易懂,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2017-10-10
  • 關于finalize機制和引用、引用隊列的用法詳解

    關于finalize機制和引用、引用隊列的用法詳解

    下面小編就為大家?guī)硪黄P于finalize機制和引用、引用隊列的用法詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • C#中File靜態(tài)類對文件的讀取寫入

    C#中File靜態(tài)類對文件的讀取寫入

    這篇文章介紹了C#中File靜態(tài)類對文件的讀取寫入,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • Unity實現(xiàn)倒計時功能

    Unity實現(xiàn)倒計時功能

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)倒計時功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C#生成隨機驗證碼代碼分享

    C#生成隨機驗證碼代碼分享

    這篇文章主要分享了C#生成隨機驗證碼代碼,另外附上使用示例,非常的簡單實用,有需要的朋友可以參考下
    2014-10-10
  • C#?將數(shù)據(jù)庫SqlServer數(shù)據(jù)綁定到類中的過程詳解

    C#?將數(shù)據(jù)庫SqlServer數(shù)據(jù)綁定到類中的過程詳解

    本文講述的是讀取數(shù)據(jù)庫中數(shù)據(jù)的常用做法,即將數(shù)據(jù)庫中的數(shù)據(jù)綁定到創(chuàng)建的類中,再將類綁定到DataGridView的數(shù)據(jù)源中的做法,對C#將SqlServer數(shù)據(jù)綁定到類中感興趣的朋友一起看看吧
    2022-06-06
  • 解析c#顯示友好時間的實現(xiàn)代碼

    解析c#顯示友好時間的實現(xiàn)代碼

    本篇文章是對c#中顯示友好時間的實現(xiàn)代碼進行了介紹,需要的朋友參考下
    2013-05-05
  • C#擴展方法實例分析

    C#擴展方法實例分析

    這篇文章主要介紹了C#擴展方法,結合實例形式分析了C#擴展方法的功能、使用方法及相關注意事項,需要的朋友可以參考下
    2017-06-06
  • C#在窗體中設計滾動字幕的方法

    C#在窗體中設計滾動字幕的方法

    普通窗體中的文字位置都是固定的,但在一些窗體中需要讓文字動起來,如一些廣告性較強的界面中需要做一些滾動的字幕,所以本文給大家介紹了C#在窗體中設計滾動字幕的方法,需要的朋友可以參考下
    2024-04-04
  • C# 獲取數(shù)據(jù)庫中所有表名、列名的示例代碼

    C# 獲取數(shù)據(jù)庫中所有表名、列名的示例代碼

    這篇文章主要介紹了C# 獲取數(shù)據(jù)庫中所有表名、列名,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論

巴东县| 临夏县| 沁水县| 六安市| 北宁市| 黄大仙区| 潼南县| 徐闻县| 金昌市| 赫章县| 瓦房店市| 重庆市| 井冈山市| 阳高县| 隆昌县| 河南省| 通辽市| 松滋市| 桑日县| 黄浦区| 黎川县| 佛坪县| 杭锦旗| 缙云县| 永德县| 潞西市| 大埔区| 五原县| 行唐县| SHOW| 汉沽区| 榆树市| 缙云县| 宿松县| 洛宁县| 巴中市| 丁青县| 威信县| 姚安县| 阳山县| 庆阳市|