欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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當(dāng)然優(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)建命令對應(yī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è)務(wù)選擇方案

5.DEMO

DEMO鏈接

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

相關(guān)文章

  • C#中datatable去重的方法

    C#中datatable去重的方法

    這篇文章主要介紹了C#中datatable去重的方法,通過兩種不同的方法對比分析了datatable去重的技巧,非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • 詳解C#中Dictionary<TKey,TValue>的存儲結(jié)構(gòu)

    詳解C#中Dictionary<TKey,TValue>的存儲結(jié)構(gòu)

    無論是實際的項目中,還是在我們學(xué)習(xí)的過程中,都會重點的應(yīng)用到Dictionary<TKey,?TValue>這個存儲類型,所以本文就來為大家介紹一下這一存儲結(jié)構(gòu)的相關(guān)知識,希望對大家有所幫助
    2023-11-11
  • 如何使用C#在PDF文件添加圖片印章

    如何使用C#在PDF文件添加圖片印章

    文檔中添加印章可以起一定的作用,比如,防止文件隨意被使用,或者確保文檔內(nèi)容的安全性和權(quán)威性。C#添加圖片印章其實也有很多實現(xiàn)方法,這里我使用的是免費的第三方軟件Free Spire.PDF,向大家闡述如何以編程的方式在PDF文件中添加圖片印章
    2017-01-01
  • C#使用GDI+創(chuàng)建縮略圖實例

    C#使用GDI+創(chuàng)建縮略圖實例

    這篇文章主要介紹了C#使用GDI+創(chuàng)建縮略圖實例,是C#程序設(shè)計中非常實用的技巧,需要的朋友可以參考下
    2014-10-10
  • C#對稱加密(AES加密)每次生成的結(jié)果都不同的實現(xiàn)思路和代碼實例

    C#對稱加密(AES加密)每次生成的結(jié)果都不同的實現(xiàn)思路和代碼實例

    這篇文章主要介紹了C#對稱加密(AES加密)每次生成的結(jié)果都不同的實現(xiàn)思路和代碼實例,每次解密時從密文中截取前16位,這就是實現(xiàn)隨機的奧秘,本文同時給出了實現(xiàn)代碼,需要的朋友可以參考下
    2015-07-07
  • c# rsa加密解密詳解

    c# rsa加密解密詳解

    這篇文章主要介紹了c# rsa加密解密的的相關(guān)資料,文中代碼非常細致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C#學(xué)習(xí)基礎(chǔ)概念二十五問續(xù)2

    C#學(xué)習(xí)基礎(chǔ)概念二十五問續(xù)2

    C#學(xué)習(xí)基礎(chǔ)概念二十五問續(xù)2...
    2007-04-04
  • C#利用遞歸算法解決漢諾塔問題

    C#利用遞歸算法解決漢諾塔問題

    這篇文章主要為大家介紹了C#如何利用遞歸算法解決經(jīng)典的漢諾塔問題,文中的示例代碼講解詳細,對我們學(xué)習(xí)C#有一定幫助,需要的可以參考一下
    2022-04-04
  • C#中float的取值范圍和精度分析

    C#中float的取值范圍和精度分析

    這篇文章主要介紹了C#中float的取值范圍和精度,較為詳細的分析了float的取值范圍與表示方法及精度等概念,有助于深入了解C#數(shù)據(jù)類型,需要的朋友可以參考下
    2014-11-11
  • C#實現(xiàn)多線程的幾種方式小結(jié)

    C#實現(xiàn)多線程的幾種方式小結(jié)

    多線程是C#中一個重要的概念,多線程指的是在同一進程中同時運行多個線程的機制,多線程適用于需要提高系統(tǒng)并發(fā)性、吞吐量和響應(yīng)速度的場景,可以充分利用多核處理器和系統(tǒng)資源,提高應(yīng)用程序的性能和效率,本文介紹了C#實現(xiàn)多線程的幾種方式,需要的朋友可以參考下
    2024-07-07

最新評論