关于 .net:Keys.Control/Shift 和 Keys.ControlKey/ShiftKey 之间的确切区别是什么?

What's the exact difference between Keys.Control/Shift and Keys.ControlKey/ShiftKey?

本问题已经有最佳答案,请猛点这里访问。

System.Windows.Forms 中的 Keys.Control 和 Keys.ControlKey/Keys.Shift 和 Keys.ShiftKey 之间的确切区别是什么?

我在谷歌上搜索过,但没有找到任何具体内容,而且 MSDN 上似乎也没有记录。

就我个人而言,我总是使用 Keys.Control/Keys.Shift,因为它工作正常。

编辑:在阅读了 KreepN 的回答后,我想如果您永远不必使用 Control/Shift,为什么它们会在框架中?

我的意思是,它们甚至不是物理键,所以我看不出微软决定创建它们的原因。

在某些情况下使用 Control/Shift 会更好吗?


ControlKey 和 ShiftKey(以及 Menu——你会认为它是
名为 AltKey) 表示物理键本身。换句话说,他们
是"实际"键,可以在 KeyEventArgs 的 KeyCode 属性中找到
对象。

另一方面,Control、Shift 和 Alt 永远不会出现在 KeyCode 中
属性,但它们的值可以在 KeyData 属性中找到。它似乎
您实际上不需要使用这些常量,因为框架
已经通过 Alt、Control 和 Shift 属性为您拉出它们
KeyEventArgs 对象,但您可以使用它们来测试 KeyData
如果你真的想的话。

源代码示例。

编辑您的编辑:

查看按下 "a" 键时返回的值:

a (未移位) / 41 / 41

A (Shift a) / 41 / 10041

Ctrl a / 41 / 20041

在这种情况下,对于所有修饰符,"KeyCode" 为 = 41。如果您只关心按下的主按钮,您可以在代码中使用它,在本例中为"a"。

如果您想根据是否按下修饰符来获得不同的功能,您需要更具体并引用"KeyData"字段并查找表示某个修饰符的#。在这种情况下,"100"表示移位,"200"表示字段开头的控制。

这并不是说您不能只检查 KeyData 字段末尾的"41",但我从来没有抱怨过方便。

可以肯定地说,您在第一个问题中寻找它们之间的"差异"是它们引用了不同的属性字段。

编辑以获得更多相关性:
与键值组合的键修饰符值与快捷方式枚举成员直接相关。例如:
Shortcut.CtrlF8 (0x20077) 与 Keys.Control | 相同Keys.F8 ( 0x20000 | 0x77 )

这在处理菜单项的已定义快捷方式属性时很有用。