gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:49:44 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com