1

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

我有一个带有自定义 MenuStrip 的表单,其中包含各种花里胡哨。这里需要注意的是,我的许多 MenuStrip 项目都有键盘快捷键 - 即用于剪切/复制/粘贴的快捷键。

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

他们都是。

.

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

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

.


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

当然,我可以手动编写代码,但是当我右键单击控件时,Cut/Copy/Paste 已经内置。如何利用这个现有功能?

我认为使用 Ctrl+C、P 和 X 添加 KeyDown 事件大约是我应该编写的最大代码。对于那些事件,我只是调用一个内置方法或其他东西。那,或者找到一个启用本机剪切/复制/粘贴的设置。

我忽略/错过了什么?

4

2 回答 2

1

除非您覆盖ContextMenuor ContextMenuStrip,否则在 TextBox 控件上测试本机复制和粘贴确实有效,在这种情况下,您将需要使用ClipBoard 类自己实现它。


在进一步查看它时,这篇MSDN 论坛文章讨论了使用 SendMessage 方法将命令发送到本机文本框控件。这是在自定义文本框中实现的,听起来就像您正在做的那样。

小摘录见文章进一步实现:

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;
}
于 2012-10-20T16:37:29.503 回答
1

简单的解决方案:在 Click 事件中使用 SendKeys.Send() 调用。

SendKeys.Send("^X"); 

我正在做一些更复杂的事情,所以这里是详细信息:我正在制作几个表单,它们都共享一些自定义控件:MenuStrip、StatusStrip 和一些其他自定义控件。我决定让所有表单都从同一个基类继承,以允许共同实现很多东西。

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 的单击事件,但在那种情况下,我只调用了一个通用方法,它执行所有代码。在这个例子中,它是多余的,但我有其他 MenuStrip 命令会改变不同子窗体的功能,所以我认为让它们都工作相同会更容易。

无论如何,这几乎可以完美地工作!它似乎将快捷键激活的 MenuStrip_Click 事件推送到底层控件(或者可能是表单?),然后实现默认的快捷键事件。

它唯一做错的事情是它仅在您执行 Ctrl + V + V + V ... 或按住 Ctrl + V 时触发一次。不过,这只是触发器无法识别多个事件的问题,而不是解决方案本身的问题。

于 2012-10-21T15:19:26.983 回答