我以为我自己解决了这个问题,但它回来困扰我的应用程序,所以在这里:
我在一个带有几个禁用和只读文本框的表单中注册了以下keydown事件处理程序,它们只是按钮的简单快捷方式:
private void AccountViewForm_KeyDown(object sender, KeyEventArgs e)
{
//e.SuppressKeyPress = true;
//e.Handled = true;
if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.E && !isInEditMode)
btnEditMode_Click(sender, e);
if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.S && isInEditMode) btnEditMode_Click(sender, e);
if (e.KeyCode == Keys.Escape) btnCancel_Click(sender, e);
if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.W) Close();
}
表单将KeyPreview设置为true,但只要readonly文本框具有焦点并按Ctrl + E,我就无法获得“Control.ModifierKeys == Keys.Control”和“e.KeyCode == Keys.E”同时是真的。真正奇怪的是Ctrl + W有效。任何人都知道到底是怎么回事? :(
答案 0 :(得分:20)
根据this question和this one,看起来处理键盘快捷键的一般方法是覆盖ProcessCmdKey()方法:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == (Keys.Control | Keys.F)) {
MessageBox.Show("What the Ctrl+F?");
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
您是否考虑过使用 Alt + E 和 Alt + S 并为您设置助记符属性纽扣?这似乎对我有用,而且设置起来更容易。
答案 1 :(得分:0)
我遇到了同样的问题
在我的应用程序中,如果使用调用的show()打开表单,则快捷方式不起作用。如果使用ShowDialog()打开表单,它们确实可以工作。我还发现,文本框的keydown事件没有被CTRL + C等触发,但是奇怪的是被CTRL + B触发了。
解决方法修复程序涉及使用keyup事件而不是keydown事件。
这是我的代码:
public void ShortCut(object sender, KeyEventArgs e, TextBox box )
{
string s, tmp1, tmp2;
int selectionIndex;
switch (e.KeyCode)
{
case Keys.V: // paste
if (Clipboard.ContainsText())
{
s = Clipboard.GetText(TextDataFormat.Text);
selectionIndex = box.SelectionStart;
tmp1 = box.Text.Substring(0, selectionIndex);
tmp2 = box.Text.Substring(selectionIndex + box.SelectionLength);
box.Text = tmp1 + s + tmp2;
}
break;
case Keys.C: // copy
if (box.SelectionLength > 0)
{
selectionIndex = box.SelectionStart;
s = box.Text.Substring(selectionIndex, box.SelectionLength);
Clipboard.SetText(s);
}
break;
case Keys.X: // cut
if (box.SelectionLength > 0)
{
selectionIndex = box.SelectionStart;
s = box.Text.Substring(selectionIndex, box.SelectionLength);
Clipboard.SetText(s);
tmp1 = box.Text.Substring(0, selectionIndex);
tmp2 = box.Text.Substring(selectionIndex + box.SelectionLength);
box.Text = tmp1 + tmp2;
}
break;
case Keys.A: // all
box.SelectAll();
break;
}
}
//这是一个调用它的示例:
private void textBoxExpression_KeyUp(object sender, KeyEventArgs e)
{
if (e.Control)
{
m_Host.ShortCut(sender, e, textBoxExpression);
}
else
{
....
}
}