C# 使用c阻止快捷键#

C# 使用c阻止快捷键#,c#,keyboard-hook,C#,Keyboard Hook,我正在使用下面的代码来禁用Alt+Tab、Alt+Esc、Ctrl+Esc和Windows键,但不知何故它不起作用。请帮我纠正一下 namespace BlockShortcuts { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private delegate int LowLe

我正在使用下面的代码来禁用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

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

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

  • 在VisualStudio之外运行它
  • 在Visual Studio中运行它,但通过菜单“调试”->“无调试启动”
  • 禁用VisualStudio宿主进程,请参见下文
请注意,您可以,但请注意潜在的副作用,引用:

当主机进程被禁用时, 以下是一些调试功能: 不可用或经验减少 演出有关详细信息,请参阅


代码总体上运行良好。您所看到的效果可能源于在Visual Studio调试器下运行,这通常意味着您正在 Visual Studio

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

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

  • 在VisualStudio之外运行它
  • 在Visual Studio中运行它,但通过菜单“调试”->“无调试启动”
  • 禁用VisualStudio宿主进程,请参见下文
请注意,您可以,但请注意潜在的副作用,引用:

当主机进程被禁用时, 以下是一些调试功能: 不可用或经验减少 演出有关详细信息,请参阅


你可以在网上查看我对相关问题的回答。 请注意
RegisterLowLevelHook
方法中的差异(您调用了自己的
KeyboardHook
,这样您就知道要比较什么了)。即使在从VS调试时,我也没有遇到任何问题。 基本上,正如其他人所说,不要使用
GetExecutingAssembly
方法,而是使用我在另一个答案中列出的方法

以下是您感兴趣的一项功能的摘录:

private IntPtr RegisterLowLevelHook(LowLevelKeyboardProc hook)
{
    IntPtr handle = IntPtr.Zero;

    using (Process currentProcess = Process.GetCurrentProcess())
    using (ProcessModule currentModule = currentProcess.MainModule)
    {
        IntPtr module = Kernel32.GetModuleHandle(currentModule.ModuleName);
        handle = User32.SetWindowsHookEx(HookType.KEYBOARD_LL, hook, module, 0);
    }

    return handle;
}

你可以在网上查看我对相关问题的回答。 请注意
RegisterLowLevelHook
方法中的差异(您调用了自己的
KeyboardHook
,这样您就知道要比较什么了)。即使在从VS调试时,我也没有遇到任何问题。 基本上,正如其他人所说,不要使用
GetExecutingAssembly
方法,而是使用我在另一个答案中列出的方法

以下是您感兴趣的一项功能的摘录:

private IntPtr RegisterLowLevelHook(LowLevelKeyboardProc hook)
{
    IntPtr handle = IntPtr.Zero;

    using (Process currentProcess = Process.GetCurrentProcess())
    using (ProcessModule currentModule = currentProcess.MainModule)
    {
        IntPtr module = Kernel32.GetModuleHandle(currentModule.ModuleName);
        handle = User32.SetWindowsHookEx(HookType.KEYBOARD_LL, hook, module, 0);
    }

    return handle;
}

@Tom Ritter,上面代码中编辑的内容。谢谢。@karthik,您可以在@Tom Ritter上找到编辑内容,上面的代码中编辑了这些内容。谢谢。@karthik,你可以在