2011-07-19 538 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並將焦點設置爲每次。我想你也可以把控制權放在別的東西的後面,或者放在不可調整大小的窗體或面板的範圍之外。