【问题标题】:Ctrl + C on Textbox does not work because of global shortcut由于全局快捷方式,文本框上的 Ctrl + C 不起作用
【发布时间】:2011-05-06 12:36:44
【问题描述】:

我创建了一个数字文本框并希望实现自定义复制/粘贴功能。

当override ProcessCmdKey时,没有收到OnKeyDown或OnKeyPress Ctrl+C,因为在应用程序中定义了一个快捷方式相同的组合。

其他组合,如 Ctrl+U 或收到的其他组合。

这甚至可能吗?怎么样?

【问题讨论】:

  • 这些其他“快捷方式”是如何实现的?这在您的问题中起着重要作用。
  • 我其实不能说。它是一个第三方 GUI 库

标签: c# .net winforms


【解决方案1】:

在这种情况下,您应该覆盖Control.OnPreviewKeyDown,对于按下Ctrl + C 的情况,将PreviewKeyDownEventArgs.IsInputKey 设置为true。这样做应该会导致调用Control.OnKeyDown,尽管此组合键有一个全局快捷方式。

更新:由于我的解决方案不适合您,第三方库显然实现了IMessageFilter,这会导致在消息级别处理快捷方式。您可以尝试添加另一个消息过滤器并在那里进行自定义处理,但是现在这会变得很难看...

【讨论】:

  • 这对我不起作用。 OnPreviewKeyDown 不为 Control+C 调用。但是它被称为 Ctrl+M
  • 感谢您的解释。我不认为我会那样做,但很高兴知道。
【解决方案2】:

正如弗洛里安指出的那样,消息不知何故在控件内部被吃掉了,由于您无法直接访问它,因此您必须变得聪明。

这个库可能对您有些用处,但您将进入相当棘手的领域,因为您必须避免正常事件(如 OnPreviewKeyDown),而改用库中的事件。

http://www.codeproject.com/KB/cs/globalhook.aspx

但是,如果您尝试自己捕获 ctrl+C 并对其进行处理,那么您可能希望避免使用这种方法。用户在点击快捷方式时不会期望发生两件事,他们会追随你。当然,我不知道你的应用是如何或做什么的,所以这只是一个猜测。

【讨论】:

  • 菜单 Ctrl+C 为应用程序相关任务打开一个自定义复制对话框。当然,每个用户都希望文本框上的 Ctrl+C 来复制选定的文本。我认为没有人会因为我这样做而追随我:)。
【解决方案3】:

在控件上将 ShortcutsEnabled 设置为 false。见TextBoxBase.ShortcutsEnabled

【讨论】:

    【解决方案4】:

    对我来说,被删除的答案效果很好。我其实自己找到了解决方案并实现了它,但没有去编译测试,并决定寻求帮助,因为 IsInputKey 是一个非常奇怪的名字,说你要捕获键。

    【讨论】:

    • 我的问题是,即使存在全局快捷方式,我是否可以捕获快捷方式。我相信在您的情况下,您没有绑定到 Ctrl+C 的全局快捷方式,因此在您的情况下调用 OnPreviewKeyDown ...
    猜你喜欢
    • 2012-02-29
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多