2011-07-19 186 views
4

我有几个按钮,点击时,我不希望他们获得焦点,也不希望空格键再次按下它们。C#停止按钮从点击获得焦点

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

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

我知道我应该重写的WndProc,但不完全知道如何着手,以我应该抓住什么消息/忽略等。至于我:

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

所以你希望按钮能够被精确地按下一次? – arootbeer

+0

我希望按钮可以多次点击,但我不希望它获得焦点。 – StudentJ

回答

6

所有你要做的在此行添加到关键的Click活动结束:

this.Focus(); 

这条线将导致按钮失去焦点,窗体将获得焦点和空格键将没有任何效果,从而满足您的2个条件。

现在,如果你不想让按钮能够被再次点击,然后添加这两条线来代替:

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

这将做什么其他行做,此外,将禁用按钮。

+0

键的点击事件?我想要的是能够点击按钮,但无论点击它多少次都不会获得焦点。像Windows计算器按钮一样。如果你的意思是将它添加到不起作用的按钮单击事件。 – StudentJ

+0

@StudentJ - 我知道你在做什么。如果您想模拟Windows计算器函数,请将'this.Focus();'添加到按钮的'Click'事件中。相信我,它会做你想做的。因为执行'this.Focus();'行会发生什么,焦点将会离开按钮并返回到窗体。 – Icemanind

+1

它将无法正常工作,焦点仍然保留在按钮上,并且不会更改为窗体。甚至用一种全新的形式尝试它,只需1个按钮。 – StudentJ

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的版本更新设计文件。应该在每个实例的两个位置。

铌:视觉工作室设计师可能会暂时中断其预览,直到您按开始。

+1

这有'PerformClick()'停止触发事件的副作用。但这可以解决:http://stackoverflow.com/questions/16951142/performclick-on-custom-button-will-not-work/31467870#31467870 – Loathing

1

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

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