2011-09-11 136 views
0

我在這樣的控制覆蓋ProcessCmdKey按下右箭頭使向上箭頭被設置

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
    if ((keyData & Keys.Up) == Keys.Up) 
     MessageBox.Show("Up arrow"); 
    else if ((keyData & Keys.Right) == Keys.Right) 
     MessageBox.Show("Right arrow"); 

    // it doesn't matter what I return, the glitch happens anyway 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

當我按下向上箭頭鍵,將出現消息Up arrow,但它也出現當我按下右箭頭鍵。爲什麼是這樣?

+0

我真的不知道,但你不會使用'((Keys)keyData)== Keys.Up)'? – Ben

+0

@mazzzzz我現在這樣做(不知道它爲什麼會工作,因爲它如何等於'Keys.Right'還有'(&Keys.Up)== Keys.Up'?)但我希望它做當按住Shift鍵時不需要再次在單獨的if中寫入條件。 –

+0

不是OT,但只是在你的事件處理器上設置斷點並檢查它。 –

回答

2

閱讀上面的註釋以獲取問題的描述。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
    if (keyData == ((Keys)(Keys.Shift | Keys.Up))) 
     MessageBox.Show("Up arrow"); 
    else if (keyData == Keys.Right) 
     MessageBox.Show("Right arrow"); 

    // it doesn't matter what I return, the glitch happens anyway 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

你甚至不需要轉換它,因爲參數是作爲關鍵字傳入的。因此,您可以比較兩個枚舉,就像您將兩個字符串或整數一樣。

+0

但是,如果按下'Shift + Up'鍵,我也想輸入'if',並且我沒有投射它我不這麼認爲 –

+0

我已經嘗試過了,如果我按住shift鍵,它就不起作用。 –

+0

試試上面的代碼,看看它是否做到了你所需要的 – Ben

3

答案是真的簡單Keys.Right具有值39和Keys.Up擁有價值38你的第一位和操作是38或39 & 38這始終是38,那麼你cheking如果38等於38,它始終是真實的。

+0

哦,謝謝,我想我認爲他們都是像C++一樣的二級權力,我應該如何測試它呢? –

+0

像@mazzzzz一樣,如果你得到一些枚舉值,就把它與你期望的值進行比較。如果(keyData == Keys.SomeKey)') –

+0

就像我說過的,即使按下Shift鍵,我也希望輸入'if'。在這種情況下,比較'keyData == Keys.SomeKey'將失敗。 –

0

確實問題是(int)鍵值不是2的冪。只要你只想捕獲單個擊鍵,就可以使用(鍵== Keys.Up)或其他。 (KeyData ==((Keys)(Keys.Shift | Keys.Up))) 我使用的解決方案可能不是最複雜的,但可能並不是最複雜的,但是,我不能在這類物品上浪費很多時間。這種方法至少工作:

const int WM_KEYDOWN = 0x100; 
const int WM_SYSKEYDOWN = 0x104; 

if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))) // Only act on on keydown 
{ 
    // allkeys will contian something like "LEFT,SHIFT". Carefull in debugger: 
    // Tooltip and Watch value still assumes powers of 2 and will show wrong values 
    string allkeys = keys.ToString().ToUpper(); 
    bool shift = allkeys.contains("SHIFT"); 
    bool alt = allkeys.contains("ALT"); 
    bool control = allkeys.contains("CONTROL"); 
    if(allkeys.Contains("UP")) 
    {} 
    else if(allkeys.Contains("DOWN")) 
    {} 
    else if(allkeys.Contains("LEFT")) 
    {} 
    else (allkeys.Contains("RIGHT")) 
    {} 
}