gpt4 book ai didi

c# - System.Windows.Forms.Keys.HasFlag 行为异常

转载 作者:行者123 更新时间:2023-12-02 01:17:02 25 4
gpt4 key购买 nike

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

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 枚举,但没有找到任何线索(尽管我必须说这是一个构造奇怪的枚举)。谁能解释为什么会这样?

最佳答案

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

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

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

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

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

关于c# - System.Windows.Forms.Keys.HasFlag 行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10162110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com