C# 使用c阻止快捷键#
我正在使用下面的代码来禁用Alt+Tab、Alt+Esc、Ctrl+Esc和Windows键,但不知何故它不起作用。请帮我纠正一下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
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,你可以在