C#Keys Enumeration Confused:Keys.Alt或Keys.RButton | Keys.ShiftKey | Keys.Alt

时间:2009-09-02 18:16:15

标签: c# enums

我试图测试是否按下了Alt键。

我的检查类似于:

private void ProcessCmdKey(Keys keyData)
{
 if (keyData == Keys.Alt)
 {
  System.Console.WriteLine ("Alt Key Pressed");
 } 
}

无论如何,当我按下Alt键时,当我按下时,调试器告诉我按下的键实际上是Keys.RButton。 Keys.ShiftKey | Keys.Alt

任何人都可以了解正在发生的事情,或者可能会指出一篇可以解释的文章吗?

由于 FZ

编辑: 我仍然有点迷失为什么ENUM会设置其他位值而不仅仅是Alt键?我知道enum可以包含多个带有标记attrivbute的状态,但是如果我按下的所有内容都是Alt,我不知道为什么会这样做?

4 个答案:

答案 0 :(得分:6)

如果要测试按下的键是否Alt part ,可以执行按位测试;

if((keyData & Keys.Alt) == Keys.Alt) {...}

答案 1 :(得分:4)

密钥是Flags Enumeration。这意味着它在给定时间可以有多个值。您应该这样检查:

if ( (keyData & Keys.Alt) == Keys.Alt)
{
   // Alt was pressed!
}

答案 2 :(得分:1)

带有FlagsAttribute的枚举是使用位实现的 请参阅此链接以获得良好的开端 - http://msdn.microsoft.com/en-us/library/cc138362.aspx

编辑:你在操作过程中用Shift键按下RIGHT(鼠标按钮),在调试时选择/突出显示某些内容吗?

答案 3 :(得分:1)

Mark的技术(the accepted answer)适用于修饰键,但令我惊讶的是,某些键(例如箭头)是位的组合,并且不起作用。例如,以下测试结果是正确的:

((Keys.Right & Keys.Left) == Keys.Left) 

我在关于箭头键处理的相关StackOverflow帖子上有posted some useful little functions for key handling