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

WPF實現(xiàn)監(jiān)聽快捷鍵的方式分享

 更新時間:2023年03月20日 09:29:06   作者:RyzenAdorer  
這篇文章主要為大家詳細介紹了WPF實現(xiàn)監(jiān)聽快捷鍵的幾種方式,文中的示例代碼講解詳細,具有一定的借鑒與學習價值,需要的可以了解一下

1.調(diào)用Win32 API

優(yōu)先級最高,全局監(jiān)聽, 支持最小化失焦等情況

那么,假如我要在一個WPF程序監(jiān)聽CTRL+5按鍵,首先在主窗口程序添加以下代碼:

        /// <summary>
        /// CTRL+5事件Id
        /// </summary>
        private const int Ctrl5KeyEventId = 9000;


        [DllImport("user32.dll")]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);

        [DllImport("user32.dll")]
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);


        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);

            var handle = new WindowInteropHelper(this).Handle;
            var source = HwndSource.FromHwnd(handle);
            source?.AddHook(HwndHook);
            //真正注冊快捷鍵監(jiān)聽處理: 同時注冊數(shù)字鍵和小鍵盤的CTRL+5
            RegisterHotKey(handle, Ctrl5KeyEventId, (uint)ModifierKeys.Control, (uint)KeyInterop.VirtualKeyFromKey(Key.D5));
            RegisterHotKey(handle, Ctrl5KeyEventId, (uint)ModifierKeys.Control, (uint)KeyInterop.VirtualKeyFromKey(Key.NumPad5));
        }


        private IntPtr HwndHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            const int wmHotkey = 0x0312;

            switch (msg)
            {
                case wmHotkey:
                    switch (wParam.ToInt32())
                    {
                        case Ctrl5KeyEventId:
                            Debug.WriteLine("Win32監(jiān)聽CTRL+5成功");
                            break;
                    }
                    break;
            }

            return IntPtr.Zero;
        }


        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);

            var handle = new WindowInteropHelper(this).Handle;
            //關(guān)閉窗口后取消注冊
            UnregisterHotKey(handle, Ctrl5KeyEventId);
        }

2.監(jiān)聽WPF的KeyDown事件

不夠清真,可選擇,最小化失焦等情況監(jiān)聽失效

        public MainWindow()
        {
            InitializeComponent();
            KeyDown += MainWindow_KeyDown;
        }


        private void MainWindow_KeyDown(object sender, KeyEventArgs e)
        {
            if (Keyboard.Modifiers == ModifierKeys.Control && (e.Key == Key.D5 || e.Key == Key.NumPad5))
            {
                Debug.WriteLine("WPF的KeyDown事件監(jiān)聽CTRL+5成功"); ;
                e.Handled = true;
            }
        }

3.XAML綁定命令方式

WPF當然優(yōu)先選中命令綁定啦,清真,最小化失焦等情況監(jiān)聽失效

以下為Window主窗體的XAML代碼

    <Window.CommandBindings>
        <CommandBinding Command="{x:Static local:Commands.Ctrl5Command}" Executed="Ctrl5Command_OnExecuted"/>
    </Window.CommandBindings>
    <Window.InputBindings>
        <KeyBinding Modifiers="Control" Key="D5"  Command="{x:Static  local:Commands.Ctrl5Command}" />
        <KeyBinding Modifiers="Control" Key="NumPad5"  Command="{x:Static  local:Commands.Ctrl5Command}" />
    </Window.InputBindings>

在Window主窗體后臺代碼創(chuàng)建命令對應的Executed方法

        private void Ctrl5Command_OnExecuted(object sender, ExecutedRoutedEventArgs e)
        {
            Debug.WriteLine("WPF的XAML綁定命令監(jiān)聽CTRL+5成功");
        }

新增命令相關(guān)的靜態(tài)類:

    public static class Commands
    {
        public static ICommand Ctrl5Command { get; } = new RoutedCommand();
    }

4.細節(jié)

三個監(jiān)聽方案的優(yōu)先級

其中Win32 > XAML綁定命令 = KeyDown事件,假如同時監(jiān)聽的話,其中會只處理高優(yōu)先級的,以上面的例子,假如

我同時監(jiān)聽三個,只會處理win32的

Win32監(jiān)聽CTRL+5成功

全局監(jiān)聽問題

其中win32支持全局監(jiān)聽鍵盤,也就是窗口在失焦情況下,例如最小化,也能監(jiān)聽得到,其中XAML綁定命令和KeyDown事件不支持失焦情況,最小化等情況也就監(jiān)聽不到了,因此,要按業(yè)務選擇方案

5.DEMO

DEMO鏈接

以上就是WPF實現(xiàn)監(jiān)聽快捷鍵的方式分享的詳細內(nèi)容,更多關(guān)于WPF監(jiān)聽快捷鍵的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#?TrackBar拖動條改變滑塊顏色

    C#?TrackBar拖動條改變滑塊顏色

    這篇文章主要為大家詳細介紹了C#?TrackBar拖動條改變滑塊顏色,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#逐行讀取txt文件的方法

    C#逐行讀取txt文件的方法

    這篇文章主要介紹了C#逐行讀取txt文件的方法,是C#程序設(shè)計中非常實用的一個技巧,需要的朋友可以參考下
    2014-09-09
  • C#使用Enum.TryParse()實現(xiàn)枚舉安全轉(zhuǎn)換

    C#使用Enum.TryParse()實現(xiàn)枚舉安全轉(zhuǎn)換

    這篇文章介紹了C#使用Enum.TryParse()實現(xiàn)枚舉安全轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • C#獲取圖片文件擴展名的方法

    C#獲取圖片文件擴展名的方法

    這篇文章主要介紹了C#獲取圖片文件擴展名的方法,實例總結(jié)了較為常見的獲取圖片文件擴展名的技巧,非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • C#循環(huán)與循環(huán)控制的表達式樹實現(xiàn)

    C#循環(huán)與循環(huán)控制的表達式樹實現(xiàn)

    這篇文章介紹了C#循環(huán)與循環(huán)控制的表達式樹實現(xiàn),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • Unity?UGUI的Text文本組件使用示例

    Unity?UGUI的Text文本組件使用示例

    這篇文章主要為大家介紹了Unity?UGUI的Text文本組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • c#實現(xiàn)輸出的字符靠右對齊的示例

    c#實現(xiàn)輸出的字符靠右對齊的示例

    下面小編就為大家分享一篇c#實現(xiàn)輸出的字符靠右對齊的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • 詳析C#的協(xié)變和逆變

    詳析C#的協(xié)變和逆變

    這篇文章主要介紹了詳析C#的協(xié)變和逆變,在引用類型系統(tǒng)時,協(xié)變、逆變和不變性具有如下定義。?這些示例假定一個名為?Base?的基類和一個名為?Derived的派生類,更多內(nèi)容請需要的小伙伴參考下面文章內(nèi)容
    2022-01-01
  • C#中線程安全問題的調(diào)試和解決

    C#中線程安全問題的調(diào)試和解決

    在C#中,多線程編程是一種常見且強大的工具,但它帶來了線程安全的問題,本文將介紹如何調(diào)試和解決C#中的線程安全問題,并深入探討鎖機制、并發(fā)控制以及調(diào)試的最佳實踐,需要的朋友可以參考下
    2025-03-03
  • 圖解如何使用C#創(chuàng)建Windows服務

    圖解如何使用C#創(chuàng)建Windows服務

    本文主要介紹了圖解如何使用C#創(chuàng)建Windows服務,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07

最新評論

天峻县| 枞阳县| 文水县| 石台县| 柘荣县| 沈丘县| 奈曼旗| 探索| 伊宁县| 嘉义市| 靖江市| 象山县| 和静县| 酒泉市| 磐安县| 五家渠市| 肇庆市| 铜鼓县| 屯昌县| 佛教| 绥德县| 革吉县| 云浮市| 奉新县| 晋州市| 澄江县| 印江| 兰考县| 荥经县| 洱源县| 五寨县| 盐城市| 邵阳县| 祁东县| 吴桥县| 曲水县| 黎川县| 天水市| 久治县| 馆陶县| 当涂县|