c#如何监听复制(剪切)事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#如何监听复制(剪切)事件相关的知识,希望对你有一定的参考价值。

最好有代码的形式展现。

C#监听复制事件
在网上查了一些资料,先采用SetClipboardViewer方法实现,具体原理可以参考http://www.cnblogs.com/jht/archive/2006/03/20/354088.html,我的程序中使用的是http://code.google.com/p/clipboardviewer/提供的ClipboardChangeNotifier.cs类,比较方便,类代码见附件(在google code中下载或http://www.kuaipan.com.cn/file/id_22823997376823393.htm),使用方法为:
主窗体初始化时:

[csharp] view plaincopy

ClipboardChangeNotifier clipChange = new ClipboardChangeNotifier();
clipChange.ClipboardChanged += new EventHandler(clipChange_ClipboardChanged);
clipChange.AssignHandle(this.Handle);
clipChange.Install();
主窗体退出时:

[csharp] view plaincopy

clipChange.Uninstall();

此程序在XP下运行正常,但是后来在WIN7下使用时遇到了一些问题,经常会在屏幕保护程序或系统休眠后,不再实时监视剪贴板,具体原因不明,后来查了下资料,有人提到SetClipboardViewer函数在Vista以上版本工作并不是很稳定,建议使用AddClipboardFormatListener这个新的API函数,MSDN(http://msdn.microsoft.com/en-us/library/windows/desktop/ms649033%28v=vs.85%29.aspx)上提到该API函数只能用于Vista及以上版本,经测试,程序工作正常

代码比SetClipboardViewer方法简单:
首先声明API函数

[csharp] view plaincopy

[DllImport("user32.dll")]
public static extern bool AddClipboardFormatListener(IntPtr hwnd);

[DllImport("user32.dll")]
public static extern bool RemoveClipboardFormatListener(IntPtr hwnd);

private static int WM_CLIPBOARDUPDATE = 0x031D;

窗体初始化时添加对剪贴板的监视:
[csharp] view plaincopy

AddClipboardFormatListener(this.Handle);

窗体关闭时移除对剪贴板的监视:

[csharp] view plaincopy

RemoveClipboardFormatListener(this.Handle);

接收到剪贴板更新的消息时,读取剪贴板内容:

[csharp] view plaincopy

protected override void DefWndProc(ref Message m)

if (m.Msg == WM_CLIPBOARDUPDATE)

UpdateClipValueList();

else

base.DefWndProc(ref m);

参考技术A Windows 系统提供了 API SetClipboardViewer,用于监视剪贴板。

Vista 或更高版本的系统建议使用新的 API AddClipboardFormatListener。

参考:http://blog.csdn.net/rrrrssss00/article/details/7430862
参考技术B 用hook方式,具体代码可以网上搜,

如何使用 C# 在文件观察器中捕获剪切和粘贴操作

【中文标题】如何使用 C# 在文件观察器中捕获剪切和粘贴操作【英文标题】:How to capture cut and paste action in file watcher using C# 【发布时间】:2012-05-23 12:31:11 【问题描述】:

我编写了文件观察器功能来专注于特定的目录活动。我可以阅读所有事件,如创建、删除、重命名和更改文件/文件夹。

但我不知道如何处理剪切和粘贴场景,因为“剪切”的结果是触发删除事件 i,而“粘贴”的结果是创建事件触发。

如何处理剪切和粘贴场景?对此有何建议。

【问题讨论】:

这只是一个猜测,但我假设所有剪切/复制操作都涉及剪贴板。尝试监控它,看看它是否适合你。 @FrankWhite 好主意!将其发布为答案! 【参考方案1】:

给你!监视剪贴板的剪切/复制/粘贴操作:)

【讨论】:

感谢您的想法...我已经尝试过剪贴板功能,但问题是文件系统观察器删除并在剪切和粘贴操作完成后创建事件引发。此时剪贴板丢失其数据和 Clipboard.ContainsFileDropList () 方法返回 false...对此有任何帮助...【参考方案2】:

在删除时,您可以存储已删除的文件,并在创建时检查它们是否相同。然后你就知道这是剪切和粘贴。

【讨论】:

以上是关于c#如何监听复制(剪切)事件的主要内容,如果未能解决你的问题,请参考以下文章

c# winform 中如何写事件监听 比如监听listview.items.count是不是发生变化

JS 操作复制剪切粘贴

我遇到了 es6 类和事件监听器的问题? [复制]

js复制内容到剪切板,兼容pc和手机端,支持Safari浏览器

Unity C# 事件监听和广播

如何使用事件侦听器复制DOM节点?