0

我想创建一个简单的应用程序来存储我使用 Ctrl+C 复制的内容。现在我在谷歌上搜索了一些有趣的代码:(我宁愿发布它的巨大链接)

http://www.prilepi.com/221(来自http://www.liensberger.it/web/blog/?p=207

http://www.prilepi.com/222

现在一切正常,唯一的问题是它完全覆盖了所有内容。这意味着当我选择文本并按 Ctrl+CI 时无法获取我选择的文本。

我知道剪贴板类,但没有任何内容存储在...

4

3 回答 3

0

要将东西添加到剪贴板,您可以使用:

Clipboard.SetText(Text, TextDataFormat.Text);

除了文本之外,还有其他几种格式选项

于 2009-10-11T17:57:11.797 回答
0

正如您所说,热键完全隐藏了其他窗口的消息。您需要做的是找到具有焦点的窗口,然后阅读它选择的文本(然后我猜可能手动将其添加到剪贴板?)

这个片段应该找到焦点窗口。它在 C++ 中,但您可以轻松地将其转换为 C#。

HWND GetGlobalFocus()
{
   GUITHREADINGO info;
   info.cbSize = sizeof(info);

   if (!GetGUIThreadInfo(0, &info))
      return NULL;

   return info.hwndFocus;
}

一旦你有了......这就是它变得棘手的地方。你可以做一个PostMessage(hWnd, WM_COPY, 0, 0);,但如果控件不支持它,它就不起作用(任何语法突出显示的控件很可能是非标准的,因此可能不会回复这个)。

您可以手动发送WM_GETTEXT消息以获取文本,然后手动将其添加到剪贴板,但这很可能会失败,因为控件严重不标准,更不用说它不会保留应用程序可能的多种剪贴板格式(想想Word)。

另一种选择是当您收到热键时,禁用您的挂钩,再次发送组合键keybd_event,然后再次启用您的挂钩,您将在剪贴板中获得数据。这看起来很笨重,但它可以工作,取决于是否keybd_event阻塞,我不记得了。

希望这可以帮助!

于 2009-10-11T13:05:24.870 回答
0

还有另一种方法,虽然它有点弱,假设您有一个等待输入的文本框,您可以通过创建一个没有任何内容的新上下文菜单来分配一个空白上下文菜单,然后将其分配给文本框. 这样,用户无法右键单击以调出用于复制/粘贴的默认上下文菜单。

编辑: 由于 OP 发布了一个不太清楚的问题,' C# Overwrite Ctrl+C code ',我认为他的意思是防止使用 Ctrl+C 复制到剪贴板。对不起,如果我的回答是错误的。您能否进一步澄清您的问题,因为这听起来具有误导性。

编辑#2:在 OP 发表评论之后,我可以提供关于他试图完成的任务的线索,对于初学者来说,前往 CodeProject 并阅读这篇文章并在全球范围内挂钩剪贴板挂钩,工作就完成了!无需放入全局键盘挂钩!连接事件ClipboardChangedClipboardStateChanged.

希望这会有所帮助,最好的问候,汤姆。

于 2010-01-24T14:59:03.463 回答