2

我正在使用以下 .NET 4.5.2 代码:

if (this.ContainsFocus && keyData == (Keys.Tab|Keys.Shift))
{ ... }

为什么当 ContainsFocus (bool = true) 和 keyData (System.Windows.Forms.Keys) 为 Keys.O 时表达式为真 | Keys.Shift?

如您所见,断点被击中:

断点截图

使用此值:

看截图

此错误(?!)的解决方法是:

if (this.ContainsFocus && (int)keyData == (int)(Keys.Tab|Keys.Shift))
{ ... }
4

2 回答 2

4

不,HasFlag没有错误。不幸的是,.NETFlagsAttribute要么全有,要么全无,并且以只能用作标志System.Windows.Forms.Keys的方式定义。Keys.Modifiers

来自https://msdn.microsoft.com/en-us/library/system.windows.forms.keys%28v=vs.110%29.aspx

Keys 类包含用于处理键盘输入的常量。Keys 枚举的成员由一个键代码和一组组合成一个整数值的修饰符组成。在 Win32 应用程序编程接口 (API) 中,键值有两半,高位包含键代码(与 Windows 虚拟键代码相同),低位表示键修饰符,例如SHIFT、CONTROL 和 ALT 键。

因此,您可以使用 来检查任何修饰符(Keys.Shift, Keys.Alt, Keys.ControlHasFlag,但不能检查其他任何修饰符。

于 2015-08-05T15:30:34.150 回答
1

这不是 的错误HasFlag,而是它的工作方式。
假设我们有以下值:

var a = (Keys.Tab | Keys.Shift);
var b = (Keys.O | Keys.Shift);

现在我们分析这些值的位(当我们将它们转换为整数时):

a: 1000000000100 000 1
b: 1000000000100 111 1

如果我们调用a.HasFlag(b)我们得到,因为并非bfalse中的每个 1 位也是a中的 1 。但是如果我们调用我们得到,因为a的每个 1 位也在b中设置。 b.HasFlag(a)true

这就是为什么您需要将值与a==b或进行比较的原因a.HasFlag(b) && b.HasFlag(a)。然后它将正常工作。

于 2015-08-05T15:02:32.437 回答