wpf 屏蔽热键

 

using System;
using System.Windows;
using System.Runtime.InteropServices;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        private struct KBDLLHOOKSTRUCT
        {
            public int vkCode;
            int scanCode;
            public int flags;
            int time;
            int dwExtraInfo;
        }

        private delegate int LowLevelKeyboardProcDelegate(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam);

        [DllImport("user32.dll")]
        private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProcDelegate lpfn, IntPtr hMod, int dwThreadId);

        [DllImport("user32.dll")]
        private static extern bool UnhookWindowsHookEx(IntPtr hHook);

        [DllImport("user32.dll")]
        private static extern int CallNextHookEx(int hHook, int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam);

        [DllImport("kernel32.dll")]
        private static extern IntPtr GetModuleHandle(IntPtr path);

        private IntPtr hHook;
        LowLevelKeyboardProcDelegate hookProc; // prevent gc
        const int WH_KEYBOARD_LL = 13;

        public App()
        {
            // hook keyboard
            IntPtr hModule = GetModuleHandle(IntPtr.Zero);
            hookProc = new LowLevelKeyboardProcDelegate(LowLevelKeyboardProc);
            hHook = SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, hModule, 0);
            if (hHook == IntPtr.Zero)
            {
                MessageBox.Show("Failed to set hook, error = " + Marshal.GetLastWin32Error());
            }
        }

        protected override void OnExit(ExitEventArgs e)
        {
            UnhookWindowsHookEx(hHook); // release keyboard hook
            base.OnExit(e);
        }

        private static int LowLevelKeyboardProc(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam)
        {
            if (nCode >= 0)
                switch (wParam)
                {
                    case 256: // WM_KEYDOWN
                    case 257: // WM_KEYUP
                    case 260: // WM_SYSKEYDOWN
                    case 261: // M_SYSKEYUP
                        if (
                            (lParam.vkCode == 0x09 && lParam.flags == 32) || // Alt+Tab
                            (lParam.vkCode == 0x1b && lParam.flags == 32) || // Alt+Esc
                            (lParam.vkCode == 0x73 && lParam.flags == 32) || // Alt+F4
                            (lParam.vkCode == 0x1b && lParam.flags == 0)  || // Ctrl+Esc
                            (lParam.vkCode == 0x5b && lParam.flags == 1)  || // Left Windows Key 
                            (lParam.vkCode == 0x5c && lParam.flags == 1))    // Right Windows Key 
                        {
                            return 1;
                        }
                        break;
                }
            return CallNextHookEx(0, nCode, wParam, ref lParam);
        }
    }
}   


 

WPF(Windows Presentation Foundation)中,为按钮指定热键(快捷键)可以通过设置按钮的`KeyBinding`属性来实现。热键允许用户通过键盘上的组合键来触发按钮对应的命令。这通常是通过在`Window`或者`UserControl`的资源中定义`KeyBinding`来完成的,然后将这个`KeyBinding`与一个命令关联起来。 具体步骤如下: 1. 在WPF的XAML中,找到或创建你的窗口或用户控件的资源部分。 2. 在资源中添加`KeyBinding`元素,并将其`Command`属性设置为你想要执行的操作对应的命令。 3. 设置`Key`属性,这是用户需要按下的键。 4. 可选地,通过`Modifiers`属性设置一个或多个修饰键,如`Ctrl`、`Alt`、`Shift`等。 下面是一个简单的例子: ```xml <Window x:Class="WpfApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Window.InputBindings> <KeyBinding Key="O" Modifiers="Control" Command="{Binding YourCommand}" /> </Window.InputBindings> <!-- 其他内容 --> </Window> ``` 在上面的例子中,按下Ctrl+O将触发与`YourCommand`命令关联的操作。 需要注意的是,为了使`KeyBinding`工作,你的命令通常需要绑定到一个实现了`ICommand`接口的对象上。如果你的命令是一个自定义命令,确保它实现了`ICommand`接口,并且在合适的上下文中被实例化和调用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值