使用 windows 剪贴板对多个自定义剪贴板进行编程 - 一些复杂性

Posted

技术标签:

【中文标题】使用 windows 剪贴板对多个自定义剪贴板进行编程 - 一些复杂性【英文标题】:Programming multiple custom Clipboard, using windows Clipboard - few complications 【发布时间】:2014-09-18 18:41:58 【问题描述】:

我正在尝试构建一个 C# 后台应用程序,该应用程序将挂钩键盘击键(例如 CAPS + (A/B/C/....))作为复制到许多不同的剪贴板。

首先,我寻找了一种类似于 CTRL+V 的 Windows 方法:直接粘贴完整的字符串。我还尝试了 SendInputs 来“粘贴”,错误的想法是执行时间太长。由于没有找到任何商品,我决定使用 Windows 剪贴板。

场景是(当我做 CAPS+A 时)

缓存剪贴板的内容以便以后检索 模拟 CTRL+C 获取剪贴板内容并将其设置为与“A”键对应的变量 将剪贴板设置为默认缓存值。

当我在记事本上时,这很有效。但是当在另一个应用程序上执行 CTRL+C 时,我在第 3 步得到异常 CLIPBRD_E_CANT_OPEN(正好 5 秒,我的应用程序无法访问剪贴板)

我的问题: - 有没有办法在不使用 Windows 剪贴板的情况下向 Windows 发送信号以“粘贴”一些给定的文本,就像 CTRL+V 一样? - 有没有办法强制剪贴板在 5 秒内返回我的应用程序? - 我错过了一个更聪明的场景吗?

谢谢!

【问题讨论】:

模拟击键完全是错误的做法。不过,这是一项非常艰巨的任务,在我看来,您还没有胜任这项任务。您可能希望查看执行此操作的现有开源(甚至商业)包,而不是用 C# 编写自己的包。我自己从未尝试过,但Ditto 看起来像一个剪贴板管理器,您可以查看。 【参考方案1】:

首先看一下这个拦截键:

[DllImport("user32.dll")]
public static extern int GetAsyncKeyState(long vKey);

VK_CONTROL = 0x11 VK_SHIFT = 0x10 C 键 = 0x43

如果按键被按下,该函数返回一个整数值>0。

【讨论】:

以上是关于使用 windows 剪贴板对多个自定义剪贴板进行编程 - 一些复杂性的主要内容,如果未能解决你的问题,请参考以下文章

Windows进程间通信(下)

将自定义表情符号复制到剪贴板

自定义列表适配器中的剪贴板管理器

从自定义键盘复制/粘贴剪贴板

Windows下的桌面之间是不是共享剪贴板?

windows剪贴板