目标:具有复制和粘贴功能的菜单条,用户应看到快捷键。
问题:如果您有一个 MenuStrip 并设置了快捷键,它们会被菜单“捕获”,但不再被文本框“捕获”。这意味着您不能在文本框中使用 Ctrl+C / V - 只能通过右键单击。如果删除快捷方式,文本框可以正常工作。
这是为什么呢?如果我不想将条目命名为“Copy______Ctrl+C”,解决方案是什么?
示例项目:http://www.file-upload.net/download-4098087/MenuBlocksSTRG.zip.html
MSDN 已关闭 ATM 我发现了此链接:
这应该适用于复制,您可以用同样的方式处理粘贴:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.C) && textBox1.ContainsFocus)
{
Clipboard.SetText(textBox1.SelectedText);
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
如果仍然重要,简单的解决方案可能是: 仅显示快捷键文本,如图所示。
在文本框中将 ShortcutsEnabled 设置为 true。仅此而已!
在这些情况下你可能必须自己处理事情。
简单的例子:
private void copyToolStripMenuItem_Click(object sender, EventArgs e) {
if (this.ActiveControl is TextBox) {
Clipboard.SetText(((TextBox)this.ActiveControl).SelectedText);
} else {
// do your menu Edit-Copy code here
}
}
private void pasteToolStripMenuItem_Click(object sender, EventArgs e) {
if (this.ActiveControl is TextBox) {
((TextBox)this.ActiveControl).SelectedText = Clipboard.GetText();
} else {
// do you menu Edit-Paste code here
}
}
您需要这样的东西吗?
ToolStripMenuItem Quit = new ToolStripMenuItem();
Quit.Name = "quitToolStripMenuItem";
Quit.Text = "&Quit";
Quit.ShortcutKeys = Keys.Alt | Keys.F4;
Quit.Click += new EventHandler(quitToolStripMenuItem_Click);
Ivan Ičin 的解决方案可以更简单:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (textBox1.ContainsFocus) return false;
return base.ProcessCmdKey(ref msg, keyData);
}
或者
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
=> textBox1.ContainsFocus ? false : base.ProcessCmdKey(ref msg, keyData);
另外,菜单栏中的复制和粘贴点通常引用某些控件,我们将其称为editForm。所以我宁愿逆向测试。这样就可以将其他文本框添加到表单中,而无需更新此功能:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
=> editForm.ContainsFocus ? base.ProcessCmdKey(ref msg, keyData) : false;