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

Aci*_*dic 1 .net c# visual-studio-2010 winforms

我正在制作一个简单的游戏,它通过覆盖OnPaint方法在表单上绘制.游戏需要键盘输入,并且工作正常,直到我决定增强GUI并在表单中添加一些按钮.

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

我不需要任何Kayboard与这些按钮的交互,我希望用户只用鼠标与它们进行交互.

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

  • 1)表格的正常KeyDownKeyUp事件.(这是我在放置按钮之前捕获键盘输入的方式.)
  • 2)覆盖表格OnKeyDownOnKeyUp事件.
  • 3)覆盖ProcessCmdKey- 工作,但无法区分KeyUp和KeyDown事件,因此对我来说不够.

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

我已经研究了好几个小时了,找不到合适的解决方案.非常感谢帮助.

Joã*_*elo 5

这是一个带有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消息列表,请检查:

Windows消息列表