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

时间:2011-11-24 12:16:29

标签: c# .net winforms visual-studio-2010

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

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

我不需要任何Kayboard与这些按钮的互动,我希望用户只使用鼠标与他们互动。

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

  • 1)表单的正常KeyDownKeyUp事件。 (就是这样 我在放置按钮之前捕获了键盘输入。)
  • 2)覆盖表单的OnKeyDownOnKeyUp个事件。
  • 3)覆盖ProcessCmdKey - 工作,但无法区分 在KeyUp和KeyDown事件之间,这对我来说是不够的。

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

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

2 个答案:

答案 0 :(得分: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 });
    }
}

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

List Of Windows Messages

答案 1 :(得分:2)

将表单的KeyPreview属性设置为True,然后在处理KeyDown / KeyUp时设置event.Handled = True。这将确保表单有机会在其子项之前处理事件。因为您将processed属性设置为true,所以childen将不会看到键盘事件。

此处有更多信息:http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx