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

我试图测试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,我不知道为什么会这样做?

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

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

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

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

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

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

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

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

我已经在一个关于箭头键处理的相关StackOverflowpost上发布了一些有用的小函数来进行键处理。