C# 从“自动完成建议”列表中选择项目会引发带有ENTER键的KeyDown事件

C# 从“自动完成建议”列表中选择项目会引发带有ENTER键的KeyDown事件,c#,autocomplete,textbox,onkeydown,C#,Autocomplete,Textbox,Onkeydown,在Winforms中,我有一个文本框,其中AutoCompleteMode设置为SuggestAppend,还有一个AutoCompleteCustomSource设置。当用户键入一些字母时,将显示建议列表。如果使用鼠标单击此列表中的某个项目,则会为ENTER键引发包含文本框的表单的KeyDown事件 使用鼠标选择建议的项目时,是否有可能不引发此事件?您可以捕捉按键: private void textBox1_KeyDown(object sender, KeyEventArgs e) {

在Winforms中,我有一个文本框,其中AutoCompleteMode设置为SuggestAppend,还有一个AutoCompleteCustomSource设置。当用户键入一些字母时,将显示建议列表。如果使用鼠标单击此列表中的某个项目,则会为ENTER键引发包含文本框的表单的KeyDown事件


使用鼠标选择建议的项目时,是否有可能不引发此事件?

您可以捕捉按键:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
    //Do nothing or something
    }
}

“自动完成”功能有几个怪癖,这些怪癖是从最初设计的Internet Explorer地址框继承而来的。这包括在单击列表中的项目时发出Enter键。在IE的地址框中按Enter键可导航到输入的URL

对此您无能为力,本机接口(iautomplete2)只有很少的选项来配置它的工作方式。它通过伪造Windows消息将按键插入文本框。这是区别的一种方式,实际的键不会被按下。您可以通过pinvoking GetKeyState()进行检查,如下所示:

    private void textBox1_KeyDown(object sender, KeyEventArgs e) {
        if (e.KeyData == Keys.Enter && GetKeyState(Keys.Enter) < 0) {
            Console.WriteLine("Really down");
        }
    }

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern short GetKeyState(Keys key);
private void textBox1\u KeyDown(对象发送方,KeyEventArgs e){
如果(e.KeyData==Keys.Enter&&GetKeyState(Keys.Enter)<0){
控制台。WriteLine(“真的向下”);
}
}
[System.Runtime.InteropServices.DllImport(“user32.dll”)]
私有静态外部短GetKeyState(Keys-key);

问题是,按文本框中的enter键应激活其他一些操作,但仅选择一个项目不应激活其他操作。因此,我需要在您的示例中的KeyDown处理程序中找出事件是通过手动按enter键引发的,还是通过选择项目引发的。当用户按enter键或双击列表中的项目时,KeyDown事件将触发e.KeyCode=13(enter)。我认为您无法处理“enter”和click事件之间的差异,因为它们被设置为触发相同的事件。你可以轻松地四处走动的唯一方法是用一个按钮激活“其他动作”,点击很多次以获得答案,这是一个有效的解决方案!我已经认识到使用自动完成功能有一些缺点。也许编写一个自定义的自动完成文本框会更好。这是一个非常有用的答案。可惜MS没有提供某种方法来确定是否使用了自动完成建议。如果他们突出显示建议并按Enter键,我想忽略Enter键。我甚至查看堆栈跟踪是否不同,但它们是相同的。如果您跟踪捕获输入的所有可能方式(键盘、粘贴、其他?),并假设未输入任何其他内容时自动完成,那么可能有一种方法。但我认为我可以不捕捉每一种可能的情况。