更新:我已经找到问题的根源,现在正试图找出最佳解决方案
我有一个带有自定义MenuStrip的表格,有各种各样的铃声和口哨声。值得注意的是,我的许多MenuStrip项目都有键盘快捷键 - 即剪切/复制/粘贴的快捷键。
看起来这个MenuStrip的存在会覆盖(并因此取消)我的文本框(和其他控件)的默认剪切/复制/粘贴键盘快捷键行为。
所有这些。
我不能说我有一个原因用于MenuStrip剪切/复制/粘贴选项,除了我希望在那里看到它们的事实。这就是Office类型程序的运作方式,也是用户(包括我自己)所期望的。
我可以从MenuStrip中删除剪切/复制/粘贴选项,但这会让人失败!那么如何让我过度设计的MenuStrip强迫我为每个剪切/复制/粘贴友好的控件实现自定义代码?
**原帖:**我在工具栏中有一个TextBox控件,可以在整个程序中使用。想象一下,当默认情况下不支持本机操作系统级别的复制/粘贴事件时,我会感到惊讶。
当然,我可以手动编写代码,但是当我右键单击控件时,已经内置了剪切/复制/粘贴。如何利用现有功能?
我想用Ctrl + C,P和X添加KeyDown事件将是我应该编写的最大值。对于那些事件我只是称为内置方法或其他东西。那,或找到一个启用原生剪切/复制/粘贴的设置。
我忽视/遗失了什么?
答案 0 :(得分:1)
测试它本机副本和粘贴确实适用于TextBox控件,除非你覆盖ContextMenu
或ContextMenuStrip
,在这种情况下你需要使用ClipBoard Class来实现它自己。
在进一步查看时,MSDN Forum article讨论了使用SendMessage方法将命令发送到本机文本框控件。这是在Custom TextBox中实现的,听起来就像你正在做的那样。
小摘录见文章以进一步实施:
protected void itemCut_Click(object sender, EventArgs e)
{
SendMessage(this.Handle, TextBoxMessages.WM_CUT, 0, 0);
}
public static class TextBoxMessages
{
public const int EM_UNDO = 0x00C7;
public const int WM_CUT = 0x0300;
public const int WM_COPY = 0x0301;
public const int WM_PASTE = 0x0302;
}
答案 1 :(得分:1)
简易解决方案:在Click事件中使用SendKeys.Send()调用。
SendKeys.Send("^X");
我正在做一些更复杂的事情,所以这里有详细信息: 我正在制作几个表单,它们共享一些自定义控件:MenuStrip,StatusStrip和一些其他自定义控件。我决定让Forms都继承自同一个基类,以允许常见的实现很多东西。
public partial class CommonFormBase : Form
{
private void Initialize()
{
//Bind click event for custom MenuStrip to events in the local Form
CommonMenuStrip.Edit_Cut.Click += new EventHandler(Edit_Cut_Click);
CommonMenuStrip.Edit_Copy.Click += new EventHandler(Edit_Copy_Click);
CommonMenuStrip.Edit_Paste.Click += new EventHandler(Edit_Paste_Click);
}
//Implement Click events for the MenuStrip by calling local methods
internal void Edit_Cut_Click(object sender, EventArgs e) { Cut(); }
internal void Edit_Copy_Click(object sender, EventArgs e) { Copy(); }
internal void Edit_Paste_Click(object sender, EventArgs e) { Paste(); }
//Generic implementation of common commands for the CommonFormBase
public virtual void Cut() { SendKeys.Send("^X"); }
public virtual void Copy() { SendKeys.Send("^C"); }
public virtual void Paste() { SendKeys.Send("^V"); }
}
我在Form级别(而不是MenuStrip级别)实现了MenuStrip的click事件,但是在那个事件中我只调用了一个泛型方法,它执行所有代码。在这个例子中它太过分了,但我有其他的MenuStrip命令会改变不同子窗体的功能,所以我认为让它们全部工作相同会更容易。
无论如何,这几乎完美无缺!它似乎将快捷键激活的MenuStrip_Click事件推送到底层控件(或者可能是Form?),然后实现默认的快捷键事件。
它唯一错误的是它只在你按Ctrl + V + V + V ...或按住Ctrl + V时触发ONCE。不过,这只是触发器无法识别多个事件的问题,而不是解决方案本身的问题。