2010-12-20 52 views
0

我有一個從文本框,我試圖確定是否在此文本框中按Ctrl-R。我可以單獨檢測密鑰:c#如何從文本框捕獲Ctrl-R

private void CheckKeys(object sender, System.Windows.Forms.KeyPressEventArgs e) 
{ 
    if(e.KeyChar == (char)Keys.R) 
    { 
    // ... 
    } 
    if ((Control.ModifierKeys & Keys.Control) == Keys.Control) 
    { 
    // ... 
    } 
} 

如何確定他們是否同時按下?

回答

4

如果可能的話,改變你的活動到KeyDown/KeyUp,一切都會更容易。 (請注意,此解決方案並不總是適用)

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyData == (Keys.Control | Keys.R)) 
    { 

    } 
} 
+0

我認爲這將工作,但我認爲在我的情況下,我將實際上想要趕上KeyUP事件。原因是如果你堅持下來,KeyDown將被髮送出去。謝謝Danny。 – poco 2010-12-20 17:19:10

3

有關如何正確構建位標誌邏輯的信息,請參閱Mitch的回答,只要他將其刪除即可。如果他不決定的話,這是可行的。你基本上需要檢查兩個條件是否同時爲真:

bool isRKeyPressed = e.KeyChar == (char)Keys.R; 
bool isControlKeyPressed = (Control.ModifierKeys & Keys.Control) == Keys.Control; 

if (isRKeyPressed && isControlKeyPressed) 
{ 
    // Both ... 
} 
else if (isRKeyPressed) 
{ 
    // R key only ... 
} 
else if (isControlKeyPressed) 
{ 
    // CTRL key only ... 
} 
else 
{ 
    // None of these... 
} 

扔掉你不關心的任何檢查。

此外,你可能想出去看看這個替代方法:(?個人控制可能) http://www.codeguru.com/columns/experts/article.php/c4639

他們覆蓋其表上的ProcessCmdKey方法: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey.aspx

+0

+1爲「同時檢查」邏輯,並建議覆蓋「ProcessCmdKey」方法。雖然,我建議在'TextBox'控件上使用它來捕獲Ctrl + R,而不是整個表單。你只想捕捉到,如果文本框是關注的,那麼爲什麼要把它放在表單層? – 2010-12-20 07:38:16

+0

我試過這個,但isRKeyPressed總是返回false。 isControlKeyPressed雖然是真的。當按下Ctrl-r時,e.KeyChar爲18 ...單獨按下R時爲114。我正在考慮檢查是否e.KeyChar == 18,但我不確定這是否會導致另一個問題。似乎並不像我最好的方法 – poco 2010-12-20 15:57:16

+0

@poco:除了許多人認爲幻數(「18」)是壞形式之外,這不會引起問題。如果你可以使用'Keys'枚舉中的一個常量,那麼你應該。據我所知,「18」應該映射到Alt鍵('Keys.Menu'),所以也許你的鍵盤有些奇怪的事情發生。 – 2010-12-21 20:02:34