使用KeyPressEvent抑制键“Bing”?

时间:2018-04-11 16:58:25

标签: c# winforms keypress keydown

在我们的应用程序中,有一个usercontrol,它允许输入一个数字(在numericupdown内),然后是combobox,允许选择SI-Prefix([p, n, µ, m, -, k, M, G, T]小大)

现在,为了便于使用,我认为在KeyPress上捕获numericUpDown - 事件并相应地设置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 - 事件的整个过程。 (没有“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;
            }
        }
    }

任何想法?

1 个答案:

答案 0 :(得分:2)

想出办法:

使用KeyDown - 事件时,您可以使用e.Modifiers检查其他键是否同时关闭。

我不知道为什么,但对于KeyDown - 事件e.KeyValue以及e.KeyCode始终返回密钥的CAPITAL版本。

因此,我修改了处理程序以将每个char转换为小写,并且只有在同时按下SHIFT的情况下才将其转换为大写:

作品 - 没有&#34; BING&#34; (对于有效的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始终报告&#34; M&#34;。

更新2:

所以,我不得不排除&#34; m&#34;从beeing匹配char.isLetter()(如果按下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

Dunno为什么 - 想法?

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;
            }

        }
    }