溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

WPF如何實(shí)現(xiàn)監(jiān)聽(tīng)快捷鍵

發(fā)布時(shí)間:2023-03-20 11:06:10 來(lái)源:億速云 閱讀:156 作者:iii 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享一下WPF如何實(shí)現(xiàn)監(jiān)聽(tīng)快捷鍵的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

1.調(diào)用Win32 API

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

那么,假如我要在一個(gè)WPF程序監(jiān)聽(tīng)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);
            //真正注冊(cè)快捷鍵監(jiān)聽(tīng)處理: 同時(shí)注冊(cè)數(shù)字鍵和小鍵盤(pán)的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)聽(tīng)CTRL+5成功");
                            break;
                    }
                    break;
            }

            return IntPtr.Zero;
        }


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

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

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

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

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)聽(tīng)CTRL+5成功"); ;
                e.Handled = true;
            }
        }

3.XAML綁定命令方式

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

以下為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主窗體后臺(tái)代碼創(chuàng)建命令對(duì)應(yīng)的Executed方法

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

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

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

4.細(xì)節(jié)

三個(gè)監(jiān)聽(tīng)方案的優(yōu)先級(jí)

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

我同時(shí)監(jiān)聽(tīng)三個(gè),只會(huì)處理win32的

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

全局監(jiān)聽(tīng)問(wèn)題

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

以上就是“WPF如何實(shí)現(xiàn)監(jiān)聽(tīng)快捷鍵”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

wpf
AI