中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WPF如何實現監聽快捷鍵

發布時間:2023-03-20 11:06:10 來源:億速云 閱讀:160 作者:iii 欄目:開發技術

今天小編給大家分享一下WPF如何實現監聽快捷鍵的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

1.調用Win32 API

優先級最高,全局監聽, 支持最小化失焦等情況

那么,假如我要在一個WPF程序監聽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);
            //真正注冊快捷鍵監聽處理: 同時注冊數字鍵和小鍵盤的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監聽CTRL+5成功");
                            break;
                    }
                    break;
            }

            return IntPtr.Zero;
        }


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

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

2.監聽WPF的KeyDown事件

不夠清真,可選擇,最小化失焦等情況監聽失效

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事件監聽CTRL+5成功"); ;
                e.Handled = true;
            }
        }

3.XAML綁定命令方式

WPF當然優先選中命令綁定啦,清真,最小化失焦等情況監聽失效

以下為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主窗體后臺代碼創建命令對應的Executed方法

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

新增命令相關的靜態類:

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

4.細節

三個監聽方案的優先級

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

我同時監聽三個,只會處理win32的

Win32監聽CTRL+5成功

全局監聽問題

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

以上就是“WPF如何實現監聽快捷鍵”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

wpf
AI

东城区| 镇原县| 津南区| 长乐市| 蕲春县| 鄂托克旗| 长武县| 高唐县| 曲麻莱县| 钟祥市| 石泉县| 达拉特旗| 新龙县| 北川| 海林市| 新余市| 巨野县| 郸城县| 长葛市| 凭祥市| 章丘市| 遂平县| 集安市| 台东县| 泸水县| 栖霞市| 扬中市| 莎车县| 广汉市| 浦东新区| 东光县| 晋宁县| 县级市| 广东省| 沁源县| 平塘县| 盐山县| 林甸县| 星子县| 马山县| 三原县|