gpt4 book ai didi

c# - 防止可聚焦控件窃取键盘输入

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

我目前正在开发一个简单的游戏,该游戏通过重写 OnPaint 方法在窗体上绘制。该游戏需要键盘输入并且运行完美,直到我决定增强 GUI 并向表单添加一些按钮。

在我添加这些按钮的那一刻,表单停止接收任何键盘输入,无论我如何努力,焦点总是在按钮上。可以通过在窗体上放置任何可聚焦控件来复制此行为。 (即文本框)

我不需要与这些按钮进行任何 Kayboard 交互,我希望用户仅通过鼠标与它们交互。

我已经尝试了以下技术来尝试解决这个问题 - 这些都不起作用:

  • 1) 表单的正常 KeyDownKeyUp 事件。 (这是方法我在放置按钮之前捕获键盘输入。)
  • 2) 覆盖表单的 OnKeyDownOnKeyUp 事件。
  • 3) 重写 ProcessCmdKey - 有效,但无法区分在 KeyUp 和 KeyDown 事件之间,所以它对我来说是不够的。

我还尝试为应用程序创建一个 MessageFilter,但我无法强制它只捕获我需要的键盘键。

我已经研究这个问题好几个小时了,但找不到合适的解决方案。将不胜感激。

最佳答案

这是一个带有用于向上和向下箭头键的 IMessageFilter 的示例表单,希望对您有所帮助:

public partial class MainForm : Form
{
private class MessageFilter : IMessageFilter
{
public MainForm Main { get; set; }
public bool PreFilterMessage(ref Message msg)
{
const int WM_KEYDOWN = 0x100;
const int WM_KEYUP = 0x101;
if (msg.Msg == WM_KEYDOWN)
{
var keyData = (Keys)msg.WParam;
if (keyData == Keys.Down || keyData == Keys.Up)
{
return true; // Process keys before return
}
}
else if (msg.Msg == WM_KEYUP)
{
var keyData = (Keys)msg.WParam;
if (keyData == Keys.Down || keyData == Keys.Up)
{
return true; // Process keys before return
}
}
return false;
}
}
public MainForm()
{
this.InitializeComponent();
Application.AddMessageFilter(new MessageFilter { Main = this });
}
}

有关可能的 Windows 消息列表,请检查:

List Of Windows Messages

关于c# - 防止可聚焦控件窃取键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8256914/

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