1

我有以下代码,旨在防止用户在备忘录文本编辑器中编写换行符:

private void m_commentMemoEdit_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData.HasFlag(Keys.Enter))
    {
        e.SuppressKeyPress = true;
    }
}

它确实阻止了 Enter 被插入,但奇怪的是它也阻止了其他键被插入。到目前为止,我们发现键:'O'、'M'、'/' 和 '-' 也被“捕获”了。

更新:以下代码可以满足我的需要:

private void m_commentMemoEdit_KeyDown(object sender, KeyEventArgs e)
{
  if (e.KeyValue == (int)Keys.Return)
  {
    e.SuppressKeyPress = true;
  }
}

但是我仍然不明白以前的代码不起作用,而这确实起作用。

我查看了System.Windows.Forms.Keys枚举,但没有找到任何线索(尽管我必须说这是一个构造奇特的枚举)。谁能解释为什么会这样?

4

3 回答 3

4

HasFlags() 继承自 Enum.HasFlags()。它对使用 [Flags] 属性声明的枚举很有用。它使用 & 运算符对位值进行测试。麻烦的是, Keys.Enter 不是标志值。它的值为 0x0d,设置了 3 位。因此,任何具有打开位 0、2 或 3 的值的键都将返回 true。与 Keys.O 一样,它的值为 0x4f。0x4f & 0x0d = 0x0d 所以 HasFlags() 返回真。

您应该只将它与实际代表标志值的键值一起使用。它们是 Keys.Alt、Keys.Control 和 Keys.Shift。请注意,这些是修饰键。因此,您可以使用 HasFlags 来查看 F 和 Ctrl+F 之间的区别。

要检测 Keys.Enter 你应该做一个简单的比较。正如你所发现的。请注意,您的 if() 语句也适用于 Alt+Enter 等,这可能不是您想要的。而是使用

if (e.KeyData == Keys.Return) e.SuppressKeyPress = true;

仅当未按下任何修改键时才会抑制 Enter 键。

于 2012-04-15T13:34:14.543 回答
1

我怀疑它与System.Windows.Forms.Keys直接映射到键盘代码的枚举的基础值有关,它们并不总是相互排斥的。文档说你不应该对它们使用任何类型的按位运算,并举例说明为什么不这样做(当心枚举上的 FlagsAttribute!)。

MSDN还说该HasFlag函数返回 this: 的结果thisInstance And flag = flag,因此您可以设置一个断点并查看输入的实际二进制代码,看看该操作是否会为您列出的键集提供一个 true。

最后,您更新的代码是做您想做的事情的正确方法。

于 2012-04-15T13:21:53.577 回答
0

HasFlag 用于标志 - 这意味着是否设置了一个位

键值是一个序数值,因此与标志完全不同的是使用比较运算符,一切都应该没问题。

一些枚举字段被定义为标志,例如

enum SomeFlag
{
   BitOne = 1, 
   BitTwo = 2, 
   Bitthree = 4
};

在这里使用“HasFlag”是有意义的

于 2012-04-15T13:30:01.577 回答