gpt4 book ai didi

c# - 使用 KeyPressEvent 抑制键 "Bing"?

转载 作者:行者123 更新时间:2023-11-30 23:03:41 24 4
gpt4 key购买 nike

在我们的应用程序中,有一个用户控件,它允许输入一个数字(在 numericupdown 内),然后是一个 组合框,它允许选择 SI 前缀( [p, n, µ, m, -, k, M, G, T] 从小到大)

现在,为了更容易使用,我认为在 numericUpDown 上捕获 KeyPress 事件并相应地设置 combobox 会很好. (如果按m,选择mili(m),如果按G,选择Giga(G) )

这可以完美地与以下处理程序/选择器一起使用:

 private void numericUpDown1_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsLetter(e.KeyChar))
{
//Check, if its valid for si prefixes.
if (this.siSelector1.TrySelect(e.KeyChar)
{
e.Handled = true;
}
}
}

其中 TrySelect 只执行以下操作:

public Boolean TrySelect(Char chr)
{
var entry = this.comboBox_siPrefix.Items.Cast<KeyValuePair<String,Double>>().Where(e => e.Key.Contains("(" + chr + ")")).FirstOrDefault();

if (!entry.Equals(new KeyValuePair<String, Double>()))
{
this.comboBox_siPrefix.SelectedItem = entry;
return true;
}
return false;
}

这很好,但是每当用户在 numericupdown 上按下非数字键时都会听到“BING”。

我阅读了有关 e.SuppressKeyPress 的信息,不幸的是它不适用于 KeyPressEventArgs - 它仅适用于 KeyEventArgs

因此,使用 KeyDown-Event 尝试整个过程是可行的。 (没有“BING”) - 但我无法捕获大写键,因为每个 KeyDown 都会立即触发事件......

 private void numericUpDown1_KeyDown(object sender, KeyEventArgs e)
{
KeysConverter kc = new KeysConverter();
if (char.IsLetter(kc.ConvertToString(e.KeyCode)[0]))
{
//Check, if its valid for si prefixes.
if (this.siSelector1.TrySelect(kc.ConvertToString(e.KeyCode)[0]))
{
e.Handled = true;
e.SuppressKeyPress = true;
}
}
}

有什么想法吗?

最佳答案

想出了一个办法:

当使用 KeyDown 事件时,您可以使用 e.Modifiers 来检查是否同时按下另一个键。

我不知道为什么,但是对于 KeyDown-Event e.KeyValue 以及 e.KeyCode 总是返回大写版本的 key 。

因此,我修改了处理程序以将每个字符转换为小写,并且仅在同时按下 SHIFT 时才将其转换为大写:

有效 - 没有“BING”(对于有效的 SI 前缀)。 :-)

private void numericUpDown1_KeyDown(object sender, KeyEventArgs e)
{
KeysConverter kc = new KeysConverter();
char c = char.ToLower(kc.ConvertToString(e.KeyValue)[0]);
if (char.IsLetter(c))
{
//Caps?
if (e.Modifiers == Keys.Shift)
{
c = char.ToUpper(c);
}

//Check, if its valid for si prefixes.
if (this.siSelector1.TrySelect(c))
{
e.Handled = true;
e.SuppressKeyPress = true;
}
}
}

上述解决方案不适用于 µ(CTRL+ALT+m 或 ALT GR+m)


更新:这不是 100%,但我现在还没明白:

  • 如果按下 ALT 键,Char-Code 总是报告“M”。

更新 2:


因此,我不得不从与 char.isLetter() 的 hive 匹配中排除“m”(如果按下 alt),最后添加另一个检查。

我发现,比较 e.KeyValue==77 按预期工作,而比较 c=='m' 没有......(然后 µ 被插入到 numericupdown 中,这是不应该的)

if (ctrl && alt && c=='m'):

enter image description here

if (ctrl && alt && e.KeyValue==77)

enter image description here

不知道为什么 - 想法?

private void numericUpDown1_KeyDown(object sender, KeyEventArgs e)
{
KeysConverter kc = new KeysConverter();
char c = char.ToLower(kc.ConvertToString(e.KeyValue)[0]);

Boolean ctrl = e.Control;
Boolean alt = e.Alt;
Boolean shift = e.Shift;
int keyPadStart = (int)Keys.NumPad0;
int keyPadEnd = (int)Keys.NumPad9;

if (e.KeyValue >= keyPadStart && e.KeyValue <= keyPadEnd)
{
//send to numeric updown.
return;
}

if (char.IsLetter(c) && !alt)
{
if (shift) c = char.ToUpper(c);

//Check, if its valid for si prefixes.
if (this.siSelector1.TrySelect(c))
{
e.Handled = true;
e.SuppressKeyPress = true;
}
}

//not working: if (ctrl && alt && c=='m')
if (ctrl && alt && e.KeyValue==77)
{
//Check, if its valid for si prefixes.
if (this.siSelector1.TrySelect('µ'))
{
e.Handled = true;
e.SuppressKeyPress = true;
}

}
}

关于c# - 使用 KeyPressEvent 抑制键 "Bing"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49780715/

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