【问题标题】:How to copy and paste text from any windows application (second clipboard)如何从任何 Windows 应用程序复制和粘贴文本(第二个剪贴板)
【发布时间】:2011-08-23 09:45:02
【问题描述】:

我有一个用 c# (WPF) 编写的 Windows 桌面应用程序,它基本上是一个呼叫中心的问题管理应用程序。它管理(添加、编辑、删除……)客户问题(数据库中的记录),其中每个问题都有许多字段(文本框、文本区域、复选框……) 生成问题时,用户经常将数据从其他资源复制/粘贴到此应用程序和其他应用程序(excel、记事本、浏览器...),并拥有一个充满有价值数据的 Windows 剪贴板。

我不知道如何解决的问题是: 用户在该程序的任何文本字段(例如文本框)中选择一个随机文本,并复制数据。但此数据无法复制到经典 windows 剪贴板

Clipboard.SetText(Textbox1.Text);

因为剪贴板已经有宝贵的数据,不能丢失。 所以我想创建第二个剪贴板来监听所有键盘输入。每当按下某个组合键时,它就会从任何应用程序(记事本、excel、我的程序……)中读取选定的文本(只需要文本)。 与其他组合键类似,它将复制的文本粘贴到任何应用程序(记事本、excel、..)

Windows 已经通过快捷键 CTRL+C 和 CTRL+V 提供了该功能,它们适用于任何不覆盖这些快捷键的应用程序。 我想为我的自定义剪贴板应用程序/服务使用不同的快捷方式。但我不知道如何获取数据并将其粘贴到任何 Windows 应用程序中的任何文本字段。 简而言之,我需要类似的东西:

string clipboardData;

public void OnSpecialCopyShortcutPressed() {
  clipboardData = SelectedTextAnywhereInWindowsOrAnyWindowsApp.Text;
}

public void OnSpecialPasteShortcutPressed() {
  focusedTextFieldAnywhereInWindowsOrAnyWindowsApp.Text = clipboardData;
}

基本上我想要两个 Windows 剪贴板。

任何指针都会很棒。 谢谢。

--- 编辑---

找到了连接到此处按下的键的解决方案global keyboard hook 仍在寻找一种方法来“连接”到活动的应用程序和选定的文本以进行复制,并寻找一种用于粘贴复制文本的集中控件。

【问题讨论】:

  • 没有人会知道如何使用您的提议。另一方面,每个人都了解剪贴板。为什么不直接使用能够记住剪贴板中项目历史记录的众多剪贴板应用之一。
  • 我向我的客户提出了同样的建议(一个可以记住复制到剪贴板的项目历史记录的应用程序),但他坚持要有两个剪贴板。使用起来相当简单,只是复制和粘贴的键与普通键盘不同。
  • 你的客户错了,但客户永远是对的!
  • 哈哈,有客户的好人是错的,但总是对的。我在窗口应用程序中推送数据的“后端窗口”开发方面没有太多经验。但是是的,我认为,在各种 Windows 应用程序中粘贴数据非常困难,除非这些应用程序是以这种方式设计的。这就是为什么我寻求帮助和其他意见。感谢您的回复

标签: c# wpf copy clipboard paste


【解决方案1】:

您不能有两个 Windows 剪贴板。您可以将某些东西放在一起,在某些情况下就像剪贴板一样,但它并不适用于每个应用程序(或大多数应用程序)。您可能希望的最好结果是在您可以控制的应用程序中使用热键捕获文本,并使用发送键将数据输入到其他合作的应用程序中。忘记 HTML、RTF、位图等花哨的格式。
我在 1991 年编写了最初的 windows 剪贴板扩展器 (ClipMate),因此我看到了各种关于如何改进剪贴板的想法。这是最糟糕的情况之一。我包含此评论不是为了取笑您或您的客户,而是希望您可以用它来说服您的客户不要在这个蠢事上浪费大量时间和金钱。

【讨论】:

  • 感谢您的评论。我确实试图说服我的客户使用已经可用的“剪贴板记录器”,例如“扩展剪贴板”或类似的东西,而不是开发第二个剪贴板。但我不/不知道制作第二个剪贴板是否明智甚至可能。
  • 没有提出反对拥有两个剪贴板的论据。这是一个有效的策略。请参阅stackoverflow.com/questions/9658282/… ref google 以及他们的所作所为。
【解决方案2】:

在应用程序之间共享数据有多种选择: IPC
内存映射文件
文件系统上的文件
通过 localhost 使用网络。

您是否探索过这些选项?

也许读过这个article

【讨论】:

    【解决方案3】:

    在这种情况下我会做的是:

    1. 创建一个名为“MyClipBoard”或其他名称的服务。
    2. 创建全局键盘挂钩以查找您要查找的任何组合键。即,Ctrl + CCtrl + V 的替代品
    3. 当您遇到用于复制的组合键时,请查找活动窗口,然后从该窗口中获取选择。
    4. 将所选内容复制到“MyClipBoard”中的内存区域。
    5. 遇到键盘粘贴组合时,将剪贴板中的数据粘贴到活动窗口的焦点窗口。

    这一切都需要对键盘挂钩和 Windows API 有很好的了解。而且这也可能不是完美的解决方案。

    最重要的问题是:你为什么要这样做?这似乎不是解决问题的正确方法。

    【讨论】:

    • 有点过头了,无论如何它都不起作用。 CTRL+C 远不是将文本放入剪贴板的唯一方法。
    • 是的,这就是我想要做的。我只是不知道如何在当前应用程序/服务之外获取活动窗口和选定文本。同样不知道如何在当前应用程序/服务之外获取以活动窗口为中心的文本框来粘贴数据。使用此应用程序的过程是:客户呼叫,程序的用户将客户电话号码保存到剪贴板。在网络上浏览另一个数据(文本),也需要将其复制到该程序中。但是剪贴板已经填满了不能丢失的电话号码...
    猜你喜欢
    • 1970-01-01
    • 2014-08-31
    • 2017-04-16
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多