检测KeyDown事件上的星号键

时间:2016-07-18 10:40:28

标签: c# winforms keyboard intellisense keyboard-events

首先,我看到了以下答案https://stackoverflow.com/a/7731051/626442,这对我的需求来说还不够。

我编写了一个具有基本智能感知功能的编辑器(有关见解,请参阅A New and Full Implementation of Generic Intellisense)。我已经使用这个编辑器实现了一些基本的SQL Server完成,但是当我输入*键时,我不断弹出intellisense。我想阻止这个。目前我做以下事情:

private void TextArea_KeyDown(object sender, KeyEventArgs e)
{
    if (!e.Control && e.KeyCode == Keys.Space || e.Shift)
        return;

    IntellisenseEngine.DisplayCompletion(this, (char)e.KeyValue);
}

我最近重新开发了我的控件,我希望建立在现有限制的基础上,何时何时不显示洞察窗口。我想要的一部分是:

+------------------------------+-------------------+
¦   ¦ Modifier   ¦ Keys        ¦ Show Completion   ¦
¦---+------------+-------------¦-------------------¦
¦ 1 ¦ Shift      ¦ None        ¦ No                ¦
¦ 2 ¦ Shift      ¦ * (see note)¦ No                ¦
¦ 3 ¦ None       ¦ Space       ¦ No                ¦
¦ 4 ¦ Any        ¦ Arrow Keys  ¦ No                ¦
+------------------------------+-------------------+

等。注意,“*”e.KeyCodeD8,这显然不是键盘不变的并且依赖于语言环境,因此是不够的。

基本上我希望我的SQL intellisense像SQL Server Management Studio(SQLMS)一样,我的问题是:

  1. 如何检测独立于键盘区域设置按下的星号字符键。

  2. 我应该采取哪些其他关键措施来抑制智能感知窗口的弹出并使其像SQLMS一样?

  3. 我尝试过使用

    private void TextArea_KeyPress(object sender, KeyPressEventArgs e)
    {
        if ((Control.ModifierKeys & Keys.Control) != Keys.Control && <Detect Space Bar> || 
             (Control.ModifierKeys & Keys.Shift) == Keys.Shift && e.KeyChar == '*')
        return;
    
        IntellisenseEngine.DisplayCompletion(this, (char)e.KeyValue);
    }
    

    但是我遇到了检测空格键的问题。

    感谢您的时间。

2 个答案:

答案 0 :(得分:1)

检查修改后的代码。希望它能起作用

private void TextArea_KeyPress(object sender, KeyPressEventArgs e)
{
    if ((Control.ModifierKeys & Keys.Contro) != Keys.Control && e.KeyChar == ' ' || 
         (Control.ModifierKeys & Keys.Shift) == Keys.Shift && e.KeyChar == '*')
    return;

    IntellisenseEngine.DisplayCompletion(this, (char)e.KeyValue);
}

答案 1 :(得分:0)

这对我有用:

private void Principal_KeyDown(object sender, KeyEventArgs e)
{
    // if no special keys detected (May, Ctrl, etc)

    char keyChar = Convert.ToChar(e.KeyValue);
    if (keyChar == '\u0010')
    {
        // your code 
    }
}