如何通过按键盘上的一个键来防止调用多个 KeyDown 事件?

Posted

技术标签:

【中文标题】如何通过按键盘上的一个键来防止调用多个 KeyDown 事件?【英文标题】:How to prevent call several KeyDown events by pressing a single key on the keyboard? 【发布时间】:2020-11-19 21:47:02 【问题描述】:

我已将表单的 KeyPreview 属性设置为 true,以便在控制事件之前调用表单的键盘事件。 表单和表单中的控件都有 KeyDown 事件,如:

表格:

private void Form1_KeyDown(object sender, KeyEventArgs e)

    if (e.Control && (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)) 
         MessageBox.Show("Control + Enter (Form)");
    

控制:

private void TextBox1_KeyDown(object sender, KeyEventArgs e)

    if (!e.Control && (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)) 
         MessageBox.Show("Control + Enter (TextBox)");
    

如您所见,这两部分代码的区别在于,在表单事件代码中,当用户同时按下 CTRL 和 Enter 键时,我需要调用 KeyDown 事件, 在 TextBox 事件代码中,我需要在用户按下 Enter 键而不按住 CTRL 键时调用该事件。

问题是当我同时按下 Ctrl 和 Enter 键时,上述两个事件都会调用。 如何防止调用这两个事件?

【问题讨论】:

尝试将Handled设置为true 您是否考虑过使用 KeyUp 代替? 【参考方案1】:

我建议您使用textBox1_KeyUp 事件。你可以参考下面的代码。我的测试成功了。

   public Form1()
    
        InitializeComponent();
        this.KeyPreview = true;
           
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    
        if (e.Control && (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return))
        
            MessageBox.Show("Control + Enter (Form)");
        
    
    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    
        if (e.KeyCode == Keys.Control)
        
            e.Handled = true;
        
        else if (e.KeyCode == Keys.Enter)
        
            MessageBox.Show("Control + Enter (TextBox)");
        
    

【讨论】:

【参考方案2】:

使用 ProcessCmdKey 并像这样。

protected override bool ProcessCmdKey(ref Message msg, System.Windows.Forms.Keys keyData)
        
            int WM_ALRT_DOWN = 0x0104;
            int WM_KEYDOWN = 0x0100;

            if (msg.Msg == WM_ALRT_DOWN && (int)msg.WParam == (int)Keys.F4) //Alt + F4
            
                return true;  // The key is manually processed
            
            if (msg.Msg == WM_KEYDOWN && (int)msg.WParam == (int)Keys.Escape) //Esc 
            
                return true;  // The key is manually processed
            
            if (msg.Msg == WM_KEYDOWN && (int)msg.WParam == (int)Keys.Space) //Space
            
                return true;  // The key is manually processed
            

【讨论】:

以上是关于如何通过按键盘上的一个键来防止调用多个 KeyDown 事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Mac上使用鼠标键来控制指针?技巧来啦

通过键盘移动 QGraphicsPixmapItem

matlab中如何设置代码提示

JQuery防止输入框上的多个反引号

React Native 如何防止键盘在文本提交时关闭?

win7系统开启键盘鼠标键来控制鼠标怎么设置