c# - 使用c#阻止快捷键

标签 c# keyboard-hook

我正在使用下面的代码来禁用 Alt+Tab、Alt+Esc、Ctrl+Esc 和 Windows 键,但不知何故它不起作用。请帮我改正。

namespace BlockShortcuts
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

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

        [DllImport("user32.dll", EntryPoint = "SetWindowsHookExA", CharSet = CharSet.Ansi)]
        private static extern int SetWindowsHookEx(
           int idHook,
           LowLevelKeyboardProcDelegate lpfn,
           int hMod,
           int dwThreadId);

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

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

        const int WH_KEYBOARD_LL = 13;
        private int intLLKey;
        private KBDLLHOOKSTRUCT lParam;

        private struct KBDLLHOOKSTRUCT
        {
            public int vkCode;
            int scanCode;
            public int flags;
            int time;
            int dwExtraInfo;
        }

        private int LowLevelKeyboardProc(
            int nCode, int wParam,
            ref KBDLLHOOKSTRUCT lParam)
        {
            bool blnEat = false;
            switch (wParam)
            {
                case 256:
                case 257:
                case 260:
                case 261:
                    //Alt+Tab, Alt+Esc, Ctrl+Esc, Windows Key
                    if (((lParam.vkCode == 9) && (lParam.flags == 32)) ||
                    ((lParam.vkCode == 27) && (lParam.flags == 32)) || ((lParam.vkCode ==
                    27) && (lParam.flags == 0)) || ((lParam.vkCode == 91) && (lParam.flags
                    == 1)) || ((lParam.vkCode == 92) && (lParam.flags == 1)) || ((true) &&
                    (lParam.flags == 32)))
                    {
                        blnEat = true;
                    }
                    break;
            }

            if (blnEat)
                return 1;
            else return CallNextHookEx(0, nCode, wParam, ref lParam);

        }

        private void KeyboardHook(object sender, EventArgs e)
        {
            intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL,new LowLevelKeyboardProcDelegate(LowLevelKeyboardProc),
                       System.Runtime.InteropServices.Marshal.GetHINSTANCE(
                       System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt32(), 0);
        }

        private void ReleaseKeyboardHook()
        {
            intLLKey = UnhookWindowsHookEx(intLLKey);
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked)
                KeyboardHook(this, e);
            else
                ReleaseKeyboardHook();
        }
    }
}

最佳答案

代码总体上运行良好。您看到的效果可能源于在 Visual Studio 调试器下运行,这通常意味着您在 Visual Studio Hosting Process (vshost.exe) .

这意味着在 KeyboardHook() 函数中调用 System.Reflection.Assembly.GetExecutingAssembly() 返回的是 vshost.exe 而不是你的可执行文件,因此无法实现为您的可执行文件安装 Hook 的预期效果。

因此,要查看有效的代码,您必须执行以下操作之一:

  • 在 Visual Studio 之外运行它
  • 在 Visual Studio 中运行它,但是通过菜单'Debug'->'Start without Debugging'
  • 禁用 Visual Studio 托管进程,见下文

请注意,您可以 disable the Visual Studio Hosting Process ,但请注意潜在的副作用,引用:

When the hosting process is disabled, several debugging features are unavailable or experience decreased performance. For more information, see Debugging and the Hosting Process.

关于c# - 使用c#阻止快捷键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1175675/

相关文章:

c# - 检查文件是否存在于控制台应用程序的文件夹中

c# - NamedPipe 多个服务器

c# - RavenDB 自动 tmpindex 和手动索引

c++ - 让非阻塞线程永久执行 "nothing"的最佳方法是什么?

c++ - 低级键盘钩子(Hook) : differentiate between key codes

C# 数据表问题

c# - ServiceStack - FluentValidation

java - 当按下键盘上的某个键时结束程序

c++ - Win32 C++ 低级键盘钩子(Hook)导致奇怪的行为

java - 你如何全局获取当前键盘状态? (即无论查询应用程序是否具有焦点,当前按下的键是什么)