gpt4 book ai didi

c# - 使用 C# 禁用键盘

转载 作者:太空宇宙 更新时间:2023-11-03 13:37:39 26 4
gpt4 key购买 nike

我正在编写一个程序,它是一个网络浏览器并禁用所有键盘快捷键和按键。它正在工作但并不完美。我找到了一个获得代码的线程:

Blocking shortcut keys using c#

我的问题是:每次我打开程序时,首先我必须在窗口中单击或使用快捷方式,然后再次在窗口中单击。之后,它就起作用了。但是当我打开它时它必须工作,所以我不必点击两次...

有人有想法吗?

干杯

编辑:好的。我尝试用另一种方式解释我的问题:

首先我打开程序。然后我应该无法按任何键,如 Win+Tab 等。但我仍然可以按键。然后,如果我在我的程序窗口中单击,按下一个键并再次在窗口中单击,它就可以工作了。但我希望程序在我打开它时能正常工作,这样我就不必先在窗口中单击。我在这里得到了一些代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace Browser
{
public partial class Form1 : Telerik.WinControls.UI.RadForm
{
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 Form1_Load(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Maximized;
}

private void webBrowser1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
KeyboardHook(this, e);
}
}
}

我希望你现在明白我的意思干杯

最佳答案

对于所有遇到同样问题的人,我得到了解决方案:

您只需将 KeyboardHook(this, e); 放在 Form1_Load() 中。所以 Form1_Load() 现在应该是这样的:

private void Form1_Load(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Maximized;
KeyboardHook(this, e);
}

原因:每次程序启动时,它应该阻止所有组合,如 Alt+F4 等。在我们将 KeyboardHook(this, e); 放入 Form1_Load(); 之前,如果在 webBrowser1

中按下某个键,程序只会阻止组合键

(webBrowser1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e))

如果将其放入 Form1_Load();,它会立即开始阻止组合。

当然,这不适用于 Win+LCtrl+Alt+Del,因为它们是热键。

希望能帮到遇到同样问题的大家:)

干杯

关于c# - 使用 C# 禁用键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18213150/

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