2012-04-15 372 views
0

我有以下代碼,旨在防止用戶在備忘錄文本編輯器編寫新線:System.Windows.Forms.Keys.HasFlag行爲古怪

private void m_commentMemoEdit_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyData.HasFlag(Keys.Enter)) 
    { 
     e.SuppressKeyPress = true; 
    } 
} 

它確實防止輸入插入,但奇怪的是,它防止其他鍵被插入。到目前爲止,我們發現鑰匙:'O','M','/'和' - '也被「抓住」。

更新:下面的代碼做什麼,我需要:

private void m_commentMemoEdit_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyValue == (int)Keys.Return) 
    { 
    e.SuppressKeyPress = true; 
    } 
} 

但我還是不明白,以前的代碼不能正常工作,這確實。

我看過System.Windows.Forms.Keys枚舉,但沒有找到任何線索(雖然我必須說這是一個奇怪的構造枚舉)。任何人都可以解釋爲什麼會發生?

回答

0

我懷疑它做的System.Windows.Forms.Keys枚舉的基礎值直接映射到鍵盤的代碼,這並不總是相互排斥的。文檔說,你不應該對它們使用任何類型的按位操作,並舉例說明爲什麼不能(Beware the FlagsAttribute on the enum!)。

MSDN還說,HasFlag函數返回這樣的結果:thisInstance And flag = flag,所以你可能會設置一個斷點,看看實際的二進制代碼進來,看看有沒有操作會給你一個真實的一套鑰匙你列出。

最後,您更新的代碼,就是去做你想做的事情的正確方法。

0

HasFlag是標誌 - 如果一個位被設置或不

的鍵值是一個順序值,所以從 使用比較操作,一切都應該罰款標誌完全不同的意思。

一些枚舉字段等標誌,例如定義

​​

這裏是有意義的使用 「HasFlag」

3

HasFlags()從Enum.HasFlags()繼承。對於使用[Flags]屬性聲明的枚舉非常有用。它使用&運算符對位值進行測試。問題是,Keys.Enter不是標誌值。它的值是0x0d,設置3位。所以任何鍵打開位0,2或3的值將返回true。像Keys.O一樣,它的值爲0x4f。 0x4f & 0x0d = 0x0d所以HasFlags()返回true。

您應該只與鍵的值,實際上代表的標誌值使用它。他們是Keys.Alt,Keys.Control和Keys.Shift。請注意,這些是修飾符鍵。所以你可以使用HasFlags來查看F和Ctrl + F之間的區別。

要檢測你應該做Keys.Enter一個簡單的比較。當你發現了。請注意,您的if()語句對於Alt + Enter等也是如此,這可能不是您想要的。取而代之的是使用

if (e.KeyData == Keys.Return) e.SuppressKeyPress = true; 

只在沒有按下修飾鍵時才抑制Enter鍵。