Aci*_*dic 1 .net c# visual-studio-2010 winforms
我正在制作一个简单的游戏,它通过覆盖OnPaint方法在表单上绘制.游戏需要键盘输入,并且工作正常,直到我决定增强GUI并在表单中添加一些按钮.
在我添加这些按钮的那一刻,表单停止接收任何键盘输入,无论我多么努力,焦点总是在按钮上.可以通过在窗体上放置任何可聚焦控件来复制此行为.(即TextBox)
我不需要任何Kayboard与这些按钮的交互,我希望用户只用鼠标与它们进行交互.
我尝试了以下技术来尝试解决这个问题 - 这些都不起作用:
KeyDown和KeyUp事件.(这是我在放置按钮之前捕获键盘输入的方式.)OnKeyDown和OnKeyUp事件.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 });
}
}
Run Code Online (Sandbox Code Playgroud)
有关可能的Windows消息列表,请检查: