`
wanjianfei
  • 浏览: 319227 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C#中的剪切板编程

阅读更多

C#定义了一个类System.Windows.Forms.Clipboard来简化剪切板操作,这个类有一个静态方法,主要有:

Clear 清除剪切板中的所有数据;
ContainsData,ContainsAudio,ContainsFlieDropList,ContainsText,ContainsImage,用于检查剪切板中是否存在相应的数据;
GetAudioStream,GetDataObject,GetText,GetImage,GetFileDropList,用于取得数据;
SetAudio,SetDataObject,SetText,SetImage,SetFileDropList,用于添加数据;

以下是检测剪切板的方法:

一、引入

要使用剪切板首先要引入三个函数,
[System.Runtime.InteropServices.DllImport("user32")]
private static extern IntPtr SetClipboardViewer(IntPtr hwnd);
[System.Runtime.InteropServices.DllImport("user32")]
private static extern IntPtr ChangeClipboardChain(IntPtr hwnd,IntPtr hWndNext);
[System.Runtime.InteropServices.DllImport("user32")]
private static extern int SendMessage(IntPtr hwnd,int wMsg,IntPtr wParam,IntPtr lParam);

const int WM_DRAWCLIPBOARD = 0x308;
const int WM_CHANGECBCHAIN = 0x30D;

IntPtr SetClipboardViewer(IntPtr hwnd) 用于往观察链中添加一个窗口句柄,这个窗口就可成为观察链中的一员了,返回值指向下一个观察者。
IntPtr ChangeClipboardChain(IntPtr hwnd,IntPtr hWndNext); 删除由hwnd指定的观察链成员,这是一个窗口句柄,第二个参数hWndNext是观察链中下一个窗口的句柄
int SendMessage(IntPtr hwnd,int wMsg,IntPtr wParam,IntPtr lParam); 发送消息

二、使用
定义完成之后,可以分三部来使用,第一步把自己的窗口添加到观察链中成为观察者,并保存下一个观察者的句柄;第二步监视剪切板,并把剪切板变化的消息发送给下一个观察者;第三步撤消自己定义的观察者,并通知下一个观察者。

第一步:把自己的窗口添加到观察链中成为观察者,并保存下一个观察者的句柄;
//存放观察链中下一个窗口句柄
IntPtr NextClipHwnd;

private void Form1_Load(object sender, System.EventArgs e)
{
//获得观察链中下一个窗口句柄
NextClipHwnd=SetClipboardViewer(this.Handle);
}

第二步:监视剪切板,并把剪切板变化的消息发送给下一个观察者,这里需要重载WndProc方法;
这里用到两个消息常量:
const int WM_DRAWCLIPBOARD = 0x308;
const int WM_CHANGECBCHAIN = 0x30D;

protected override void WndProc(ref System.Windows.Forms.Message m)
{
switch(m.Msg)
{
case WM_DRAWCLIPBOARD:
//将WM_DRAWCLIPBOARD消息传递到下一个观察链中的窗口
SendMessage(NextClipHwnd,m.Msg,m.WParam,m.LParam);
IDataObject iData = Clipboard.GetDataObject();
//检测文本
if(iData.GetDataPresent(DataFormats.Text)|iData.GetDataPresent(DataFormats.OemText))
{
this.richTextBox1.Text=(String)iData.GetData(DataFormats.Text);
}
//检测图像
if (iData.GetDataPresent(DataFormats.Bitmap))
{
pictureBox1.Image=Clipboard.GetImage();
NewClipData();
}
//检测自定义类型
if (iData.GetDataPresent("myFormat"))
{
MyObj myobj=(MyObj)iData.GetData("myFormat");
this.richTextBox1.Text=myobj.ObjName;
}
break;
default:
base.WndProc(ref m);
break;
}
}

第三步:撤消自己定义的观察者,并通知下一个观察者。
private void Form1_Closed(object sender, System.EventArgs e)
{
//从观察链中删除本观察窗口(第一个参数:将要删除的窗口的句柄;第二个参数://观察链中下一个窗口的句柄 )
ChangeClipboardChain(this.Handle,NextClipHwnd);
//将变动消息WM_CHANGECBCHAIN消息传递到下一个观察链中的窗口
SendMessage(NextClipHwnd,WM_CHANGECBCHAIN,this.Handle,NextClipHwnd);
}

三、扩展
DataFormats类定义了剪切板内容的几种格式,包括Text,UnicodeText,OemText,Rtf,Html,Dib,Bitmap等,但自己可以定义新的数据格式,代码如下 :
//新类
public class MyObj
{
private string objName;
public MyObj()
{
objName = "自定义剪切板内容";
}
public string ObjName
{
get { return objName; }
}
}

//往剪切板中添加一个自定义内容
private void NewClipData()
{
DataFormats.Format myFormat = DataFormats.GetFormat("myFormat");
MyObj myobj = new MyObj();
DataObject myDataObject = new DataObject("myFormat", myobj);
Clipboard.SetDataObject(myDataObject);
}
其中myFormat就是自定义数据格式的名称,
在上面的WinProc中可以看到
//检测图像
if (iData.GetDataPresent(DataFormats.Bitmap))
{
pictureBox1.Image=Clipboard.GetImage();
NewClipData();
}

检测到剪切板中有图像内容时,就显示这个图像,然后,调用NewClipData(),产生一个新剪切板数据,其格式是自定义的myFormat,这时,程序会通过下面这段代码来检测到这个变化,并处理
//检测自定义类型
if (iData.GetDataPresent("myFormat"))
{
MyObj myobj=(MyObj)iData.GetData("myFormat");
this.richTextBox1.Text=myobj.ObjName;
}

分享到:
评论

相关推荐

    C#获取剪切板内容

    本文将深入探讨如何使用C#获取剪切板内容,这在日常编程中是一个非常实用的功能,比如在实现复制、粘贴或者数据交换的场景下。 首先,我们需要了解Windows操作系统中的剪切板。剪切板是系统提供的一种临时存储数据...

    C#监控剪切板例子程序

    因此,理解和掌握剪切板编程对于开发高效、安全的应用至关重要。 总结一下,"C#监控剪切板例子程序"是一个利用C#和Windows剪切板API实现的示例应用,它展示了如何监听剪切板的变化并获取其中的文字内容。通过这个...

    剪切板使用_C#_剪切板_

    在编程领域,尤其是在使用C#语言进行开发时,剪切板功能是一个常用且重要的工具,它允许程序与操作系统之间交换数据,比如复制、剪切和粘贴文本、图像等内容。本教程将深入探讨C#中如何操作剪切板,帮助初学者理解并...

    练习C#的剪切板复制粘贴功能

    在C#编程中,剪切板操作是日常开发中经常遇到的功能,比如在文本编辑器、文件管理器等应用中。本练习主要关注如何利用C#实现剪切板的复制和粘贴功能,这对于理解.NET Framework提供的System.Windows.Forms.Clipboard...

    C#做的各剪切板查看复制工具

    标题 "C#做的各剪切板查看复制工具" 暗示了这是一个使用C#编程语言开发的应用程序,专门用于查看和操作操作系统中的剪贴板内容。剪贴板是计算机系统中一个临时存储数据的地方,用户可以将文本、图像或其他类型的数据...

    C# 实现剪切板 让程序完美

    在C#编程中,剪切板(Clipboard)是Windows操作系统提供的一种服务,允许应用程序之间交换数据,例如文本、图像等。实现剪切板功能可以使我们的程序更加完善,提高用户体验,尤其是在处理复制、剪切和粘贴操作时。...

    C#使用剪切板粘贴数据

    在C#编程中,剪切板(Clipboard)是.NET Framework提供的一种系统级服务,它允许程序之间进行数据交换,常见的操作包括复制、剪切和粘贴。本篇将详细讲解如何在C#中利用剪切板功能来实现数据的粘贴。 首先,剪切板...

    C#监听剪贴板

    在编程领域,尤其是在Windows应用程序开发中,剪贴板是一个常用的功能,它允许用户临时存储和复制数据。在C#中,我们可以通过操作系统提供的API或.NET Framework的类来操作剪贴板。本篇将深入探讨如何使用C#进行剪贴...

    C#项目使用剪切板

    在C#编程中,剪切板(Clipboard)是.NET Framework提供的一种系统级服务,它允许应用程序之间进行数据共享。这个功能对于实现复制、剪切、粘贴等操作至关重要。本项目将详细介绍如何在C#中使用剪切板,帮助开发者...

    c#中把剪贴板里面的图片保存到文件

    在C#编程中,将剪贴板中的图片保存到文件是一项常见的操作,尤其在处理用户复制的图像数据时。这个程序可能是一个简单的桌面应用程序,它能够读取剪贴板中的内容,然后将其作为图片文件存储在本地系统上。以下是实现...

    剪切板监视器

    剪切板监视器是一款基于C#编程语言开发的实用工具,它主要的功能是实时监控用户的剪贴板活动。当你在日常操作中使用Ctrl+C复制文本时,这款软件会自动记录这些文本内容,并将其存储在内存中。这样,如果你不小心丢失...

    C# 监听剪贴板 截图 重绘 ClipWeb

    在软件开发中,C#是一种广泛使用的编程语言,尤其在Windows应用程序开发中占据重要地位。本篇文章将详细探讨一个基于C#的小型应用程序——“ClipWeb”,它实现了剪贴板监听、截图以及控件重绘等功能,具有较高的学习...

    使用C#进行屏幕截图并自动保存到剪切板 主要用到Clipboard Graphics Rectangle Screen等

    在C#编程中,进行屏幕截图并将其保存到剪贴板是一个常见的需求,尤其是在开发桌面应用或者自动化测试中。这个过程涉及到几个关键的.NET Framework类,包括`Clipboard`, `Graphics`, `Rectangle`以及`Screen`。下面将...

    C# 图片存储到剪贴板

    在本篇文章中,我们将探讨如何使用 C# 编程语言将图片数据存储到系统的剪贴板中。这一技术可以被广泛应用于需要进行图像复制、粘贴操作的应用场景中,比如图像处理软件、办公自动化工具等。 #### 相关知识点 1. **...

    Clip1.rar_Clipboard_剪切板

    本资源"Clip1.rar_Clipboard_剪切板"提供了关于剪切板编程的完整功能实现,涵盖了剪切板操作的关键知识点。 首先,我们来讨论剪切板的基本概念。在Windows系统中,剪切板是操作系统维护的一个临时存储区,用于存储...

    C#线程间不能调用剪切板的解决方法

    在C#编程中,线程间通信和资源共享是常见的需求,而剪切板作为系统级的共享资源,其访问权限受到严格的控制。线程间不能直接调用剪切板的原因在于剪切板只能在单线程单元(Single Thread Apartment, STA)中访问,这...

    c#实现Windows剪贴板监视器

    在编程领域,尤其是在Windows应用程序开发中,有时我们需要监控用户的剪贴板操作,以便在特定情况下进行响应或记录。本文将详细介绍如何使用C#语言来实现一个Windows剪贴板监视器。 首先,剪贴板是操作系统提供的一...

    c#图片拖放和剪切板功能

    在C#编程中,图片拖放(Drag and Drop)和剪切板功能是常见的用户界面交互技术,主要用于提高用户体验和简化数据传输。本文将详细解释这两个功能的实现及其在实际应用中的重要性。 首先,我们来看一下C#中的图片...

    C#实现剪切板功能

    在C#编程语言中,实现剪切板功能主要依赖于.NET框架提供的剪切板类Clipboard。该类位于System.Windows.Forms命名空间下,为开发者提供了方便的接口来操作系统剪切板中的数据。首先,需要理解剪切板是一个用于临时...

    C#实现剪贴板循环使用源码Text

    至于"源码",在编程中,源码指的是程序员编写的原始代码,它是可读的,用人类可理解的语言编写。在本例中,`codefans.net`可能是提供源码下载的网站。下载源码可以帮助开发者理解实际的实现细节,对于学习和调试很有...

Global site tag (gtag.js) - Google Analytics