簡體   English   中英

如何通過按鍵盤上的單個鍵來防止調用多個 KeyDown 事件?

[英]How to prevent call several KeyDown events by pressing a single key on the keyboard?

我已將表單的 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 鍵時,上述兩個事件都會調用。 如何防止調用這兩個事件?

我建議您使用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)");
        }
    }

使用 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
            }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM