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



更新:我已经弄清楚了问题的来源,现在试图找出最佳修复程序

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

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

全部。

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

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


**原始帖子:**我在工具栏中有一个文本框控件,该控制栏将在整个程序中使用。想象一下,默认情况下不支持本地OS级复制/粘贴事件时,我感到惊讶。

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

我认为,使用CTRL C,P和X添加一个键down事件大约是我必须代码的最大值。对于这些事件,我只是称为内置方法或其他方法。那,或找到一个启用本机剪切/复制/粘贴的设置。

我忽略了什么?

除非您超越ContextMenuContextMenuStrip,否则对本机副本进行测试,并且粘贴确实可以在文本框控件上工作,在这种情况下,您需要使用剪贴板类自行实现。<<<<<<<<<<<<<<<<<<<<<<<<<<<<


进一步查看此MSDN论坛文章,讨论了使用SendMessage方法将命令发送到本机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;
}

易于解决方案:在单击事件中使用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"); }
}

我在表单级别(不是Menustrip级别)实现了Menustrip的点击事件,但是在此事件中,我只调用一个通用方法,该方法可以完成所有代码。在此示例中,它是过度的,但是我还有其他menustrip命令,这些命令会改变不同的儿童形式的功能,所以我认为让它们都相同的工作会更容易。

无论如何,这几乎可以完美!似乎将快捷键激活的Menustrip_Click事件推向了基础控件(或表格?),然后将其实现默认快捷方式关键事件。

唯一错误的事情是,当您进行Ctrl V V V ...或保持Ctrl V时,它仅触发一次。尽管如此,这只是触发的问题没有识别多个事件,而不是解决方案本身的问题。

最新更新