91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

延吉市| 新野县| 南靖县| 兴业县| 天峨县| 左贡县| 苏州市| 淳化县| 乌拉特前旗| 哈密市| 葫芦岛市| 竹北市| 镇赉县| 长葛市| 中牟县| 西林县| 云龙县| 始兴县| 双桥区| 乡城县| 上饶市| 赣榆县| 格尔木市| 澄迈县| 淄博市| 曲周县| 盐池县| 石城县| 新巴尔虎左旗| 格尔木市| 大名县| 河池市| 腾冲县| 土默特左旗| 临泽县| 长沙县| 白沙| 阜宁县| 获嘉县| 五华县| 西乌珠穆沁旗|