C# 如何通过按键盘上的一个键来防止调用多个按键事件?
我已将窗体的KeyPreview属性设置为true,以便在控件事件之前调用窗体的键盘事件。 表单和表单中的控件都具有类似于以下内容的KeyDown事件: 表格: 控制:C# 如何通过按键盘上的一个键来防止调用多个按键事件?,c#,winforms,events,C#,Winforms,Events,我已将窗体的KeyPreview属性设置为true,以便在控件事件之前调用窗体的键盘事件。 表单和表单中的控件都具有类似于以下内容的KeyDown事件: 表格: 控制: private void TextBox1_KeyDown(object sender, KeyEventArgs e) { if (!e.Control && (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)) { Messag
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事件,
在文本框事件代码中,我需要在用户按下Enter键而不按住CTRL键时调用该事件
问题是,当我同时按下Ctrl键和Enter键时,上述两个事件都将调用。
如何防止调用这两个事件?使用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
}
}
使用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
}
}
我建议您使用textBox1_键控事件。您可以参考以下代码。我的测试成功了
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)");
}
}
我建议您使用textBox1_键控事件。您可以参考以下代码。我的测试成功了
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)");
}
}
尝试设置为true。是否想过改用KeyUp?尝试设置为true。是否想过改用KeyUp?