C# - 覆盖Ctrl + C控件

时间:2009-10-11 12:46:16

标签: c# clipboard copy-paste

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

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

http://www.prilepi.com/222

现在事情很好,唯一的问题是它完全覆盖了一切。这意味着当我选择文本并按Ctrl + C时,我无法获得我选择的文本。

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

3 个答案:

答案 0 :(得分: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阻止或不阻止它可能会起作用,我不记得了。

希望这有帮助!

答案 1 :(得分:0)

要向剪贴板添加内容,您可以使用:

Clipboard.SetText(Text, TextDataFormat.Text);

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

答案 2 :(得分:0)

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

编辑: 由于OP发布的问题不完全清楚,“ C#覆盖Ctrl + C代码”,我认为他的意思是,要防范使用Ctrl + C复制到剪贴板。对不起,如果我的回答错了。你能不能再澄清一下你的问题,因为它听起来有误导性。

编辑#2:在OP的评论之后,我可以给出他想要完成什么的线索,对于初学者,请转到CodeProject并阅读此article并挂钩剪贴板挂钩全局,工作完成!无需加入全局键盘钩!结束活动ClipboardChangedClipboardStateChanged

希望这有帮助, 最好的祝福, 汤姆。