2011-09-11 42 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")) 
    {} 
}