WinForm文本框:MenuStrip键盘快捷键覆盖OS级复制/粘贴

时间:2012-10-20 16:17:03

标签: winforms textbox copy paste

更新:我已经找到问题的根源,现在正试图找出最佳解决方案

我有一个带有自定义MenuStrip的表格,有各种各样的铃声和口哨声。值得注意的是,我的许多MenuStrip项目都有键盘快捷键 - 即剪切/复制/粘贴的快捷键。

看起来这个MenuStrip的存在会覆盖(并因此取消)我的文本框(和其他控件)的默认剪切/复制/粘贴键盘快捷键行为。

所有这些。

我不能说我有一个原因用于MenuStrip剪切/复制/粘贴选项,除了我希望在那里看到它们的事实。这就是Office类型程序的运作方式,也是用户(包括我自己)所期望的。

我可以从MenuStrip中删除剪切/复制/粘贴选项,但这会让人失败!那么如何让我过度设计的MenuStrip强迫我为每个剪切/复制/粘贴友好的控件实现自定义代码?


**原帖:**我在工具栏中有一个TextBox控件,可以在整个程序中使用。想象一下,当默认情况下不支持本机操作系统级别的复制/粘贴事件时,我会感到惊讶。

当然,我可以手动编写代码,但是当我右键单击控件时,已经内置了剪切/复制/粘贴。如何利用现有功能?

我想用Ctrl + C,P和X添加KeyDown事件将是我应该编写的最大值。对于那些事件我只是称为内置方法或其他东西。那,或找到一个启用原生剪切/复制/粘贴的设置。

我忽视/遗失了什么?

2 个答案:

答案 0 :(得分:1)

测试它本机副本和粘贴确实适用于TextBox控件,除非你覆盖ContextMenuContextMenuStrip,在这种情况下你需要使用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。不过,这只是触发器无法识别多个事件的问题,而不是解决方案本身的问题。