C#停止按钮从获得焦点点击

时间:2011-07-19 02:08:29

标签: c# windows forms button focus

我有几个按钮,点击时我不希望它们得到焦点,我也不希望空格键再次“按下”它们。

我想要与windows计算器中的按钮相同的功能。

谷歌搜索和搜索堆栈一切似乎是关于形式,例如。 Make a form not focusable in C#

我知道我应该重写WndProc,但不确定如何处理我应该捕获/忽略的消息等等。据我所知:

protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
    }

3 个答案:

答案 0 :(得分:15)

我今天处理了这个问题,下面是对我来说最简单的答案。我不想使用this.Focus(),因为我需要专注于保持不变。

http://social.msdn.microsoft.com/Forums/windows/en-US/f1babeac-4bd9-498f-b19b-90b9fed0d751/c-stop-button-from-gaining-focus-on-click

创建自己无法选择的按钮类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace YourNameSpaceHere {
    class NoSelectButton : Button{

        public NoSelectButton() {

            SetStyle(ControlStyles.Selectable, false);

        }
    }
}

现在,使用NoSelectButton而不是System的版本更新设计文件。应该在每个实例的两个位置。

Nb:Visual Studio设计器可能会暂时中断其预览,直到您按下“开始”。

答案 1 :(得分:6)

您要做的就是将此行添加到密钥的Click事件的末尾:

this.Focus();

此行将导致按钮失去焦点,窗体将获得焦点,空格键将无效,从而满足您的2个条件。

现在,如果您不希望再次单击该按钮,请改为添加以下两行:

this.Focus();
((Button)sender).Enabled = false;

这将执行其他行所做的事情,此外,它将禁用该按钮。

答案 2 :(得分:1)

正如评论中所提到的,我发现最简单的方法是将输入控件添加到不执行任何操作的表单(没有事件处理程序),然后在按钮的OnClick方法中使用{{1} }。但请注意,如果将虚拟控件的Control.Focus()属性设置为false,则无效。

所以我的解决方案是添加一个虚拟按钮,将其大小设置为0,0,并将焦点设置为每次。我想你也可以把控件放在别的东西之外或者不可调整大小的表格或面板之外。