Visual C#的剪切板編程(转)

转载 2012年06月12日 09:59:20
Visual C#是微软.Net框架中的一个重要的程序开发语言,虽然在.Net框架中还有其它的程序开发语言,但微软似乎对Visual C#更喜爱有加。这同时也就决定了Visual C#在.Net框架中的地位,以及他以后的发展前途。由于针对剪切板方面的编程始终是程序设计的一个重点,当然也可以算是一个难点。本文将探讨如何利用Visual C#进行剪切板编程。本文将结合二个具体的程序例子来介绍Visual C#剪切板编程的二个重要方面:判定剪切板中的数据类型、保存剪切板中的数据。首先来介绍Visual C#如何判定剪切板中的数据类型的。{)b}}
bpf
剪切板中可以存放许多类型的数据,而Visual C#可以判定剪切板中的数据类型大致有21种,这其中包括位图(Bitmap)、文本(Text)、超文本(Html)等,由于类型比较将多,本文将只介绍比较典型的数据类型,对于其它的数据类型,操作方法基本类似。2oN
}}2sT
一. 本文程序设计和运行的环境AlgsBE
_F
(1).微软公司窗口2000服务器版^QM_A
  (2)..Net FrameWork SDK Beta 2Kc+4
 
  f[fMEY
二. 介绍程序中使用到的类和接口^5"^U
Qb
Visual C#判断剪切板中的数据类型,要使用到.Net FrameWork SDK中二个类(Class)和一个接口(Interface),具体的就是:Clipboard类、Dataformats类和IdataObject接口。这三者的作用是:Clipboard类是一个不可以继承的类,他的主要作用是通过自身的方法来实现在计算器系统的剪切板中存放和获得数据。Dataformats类主要是提供了一个预先设定好的剪切板数据类型,并可以被IdataObject接口调用来判定剪切板数据类型。IdataObject接口提供了一个自由格式的装置来传输数据。下面就结合这些类和接口来具体看一下,具体的使用方法。cc|@=
eU@>M
三. Visual C#判定剪切板数据类型的解决思路以及重要步骤的解决办法J!
&M
(1).首先要读取剪切板中的数据内容:0zO0g,
wP;P
Clipboard类中有一个方法叫GetDataObject ( ),此方法的作用就是读取当前剪切板中的数据内容。要把读取了当前剪切板中数据存放起来,这就要用到IdataObject接口,这个接口可以使用在Clipboard类和Drag and Drop的操作中。下面这些代码就是读取把当前剪切板中的数据内容并存放起来。.
fUac
IDataObject d = Clipboard.GetDataObject ( ) ;/(OQ
)6u}
(2).判定当前剪切板中的数据类型:&@
}
在IdataObject接口中有一个方法名称是GetDataPresent ( ),这个方法的作用是检测存放在接口的数据是否是指定的数据类型或者可以转换成指定的数据类型。他的返回值是布尔型,True表示为指定的数据类型或者可以转换成指定的数据类型。False于上面意思相反。下面语句实现的功能是判定当前剪切板的数据内容是否为位图、文本和超文本的,具体如下:;:R2
-
if ( d.GetDataPresent ( Dataformats.Bitmap ) ) {*
  Console.WriteLine ( "当前剪切板中的数据类型是位图!" ) ;D*
  } else if ( d.GetDataPresent ( Dataformats.Text ) ) {o"=8P
  Console.WriteLine ( "当前剪切板中的数据类型是文本!" ) ;%3b
  } else if ( d.GetDataPresent ( Dataformats.Html ) ) {.en cA
  Console.WriteLine ( "当前剪切板中的数据类型是超文本!" ) ;/<
  } else {Pr
  Console.WriteLine ( "当前剪切板中的数据类型是其它类型数据!" ) ;+_N
  } j
L6E
四. 程序源代码6Zt
ro9B*
通过上面的介绍,我们不难理解下面这些程序代码,这些程序代码的功能就是判定当前剪切板中的数据是什么类型。具体如下:~QNU
u
using System ;Tl
  using System.Windows.forms ;ARn
  public class MyClipboard_`3O
  { yR`8``
  public static void Main ( string [ ] args )!I
  { $qcPj7
  IDataObject d = Clipboard.GetDataObject ( ) ;|ECJ
yNhq
if ( d.GetDataPresent ( Dataformats.Bitmap ) ) {=?H
  Console.WriteLine ( "当前剪切板中的数据类型是位图!" ) ;|Lg8&
  } else if ( d.GetDataPresent ( Dataformats.Text ) ) {ogC](<
  Console.WriteLine ( "当前剪切板中的数据类型是文本!" ) ; xzNR
  } else if ( d.GetDataPresent ( Dataformats.Html ) ) {YO{^
  Console.WriteLine ( "当前剪切板中的数据类型是超文本!" ) ;Mj
  } else {/y_
  Console.WriteLine ( "当前剪切板中的数据类型是其它类型数据!" ) ;Pmj>
  } Scf5
  } #;c.>"
  } o^jQyB
五. Visual C#保存剪切板数据的解决思路以及重要步骤的解决办法Ow%O
|
用Visual C#保存剪切板中的数据要使用的类和接口和判定剪切板中的数据类型基本一样。但由于要读取剪切板数据,就需要用到了IdataObject接口的方法GetData ( ),这个方法的作用就是获得指定类型的数据内容。他的语法为:;.Ba
!
object GetData ( Type ) ;4yD
xfwTf
我们注意到这个方法返回的类型是一个Object类型,这是一个参考类型,他的变量就是一个参考类型变量,而我们读取的内容应该是一个实值类型变量,这就又涉及到装箱和出箱的问题了。由于在前面的文章中已经比较详细的说明了这二者的关系(见《用Visual C#动态生成组件》),所以在本文就不介绍了。在本文的程序中是通过下列二行语句来实现这种由参考类型变量转换成实值类型变量的过程:)>/Q+
3.rmmR
Bitmap b = ( Bitmap ) d.GetData ( Dataformats.Bitmap ) ;//位图g
String c = ( String ) d.GetData ( Dataformats.Text ) ;//文本n9od
2NR)D_
实现保存剪切板中数据的程序的设计思路是,首先判定当前剪切板中的数据类型,如果数据类型为位图,则保存到C盘的"my.bmp"文件中,如果数据类型是文本,则用一个RichText组件显示出来。否则则提示是其它类型数据。?V4
3FC~
如何判定剪切板数据类型在上面已经介绍过了,程序的另外一个难点就是,假定已经判定剪切板中的数据类型为位图,如何保存数据。在程序中是通过名称空间System.Windows.forms中的Bitmap类的Save ( )方法来实现的。下列语句就是具体的实现方法。K
<uDW
Bitmap b = ( Bitmap ) d.GetData ( Dataformats.Bitmap ) ;e
  b.Save ( @"c:/my.bmp" ) ;Qqz's
  MessageBox.Show ( "当前剪切板内容是位图,已经保存到"MY.BMP"文件中!" ) ;X]
+(
六. 用Visual C#读取当前剪切板中数据内容并保存的程序源代码rXT@>f
>pua
通过上面的介绍,可以得到实现上述功能的源程序代码,如下:!hmP
/
using System ;>HDP<Q
  using System.Drawing ;=y5
  using System.Collections ;u@lzX
  using System.ComponentModel ;}wPq{C
  using System.Windows.forms ;]*}~:D
  using System.Data;c
  public class form1 : formR4O34
  { TbpHa=
  private RichTextBox richTextBox1 ;";0
  private Button button1 ;IA
  private System.ComponentModel.Container components = null ;Ec-d
  public form1()/^49j
  { r
  //初始化窗体中的各个组件d%Xnd
  InitializeComponent ( ) ;VEM
  } 0#&-g
  //清除程序中使用过的资源juF1~I
  protected override void Dispose ( bool disposing )c`4Ees
  { @
  if ( disposing )T
  { kZ.
  if ( components != null ) *O
  { hD+:
  components.Dispose ( ) ;sh$'
  } &N]^?
  } G2
  base.Dispose ( disposing );'#
  } [
  private void InitializeComponent ( )_6
  { YC+
  this.richTextBox1 = new RichTextBox ( ) ;qI[
  this.button1 = new Button ( ) ;P
  this.SuspendLayout ( ) ;tH
a.UZv
this.richTextBox1.Location = new System.Drawing.Point ( 40 , 16 ) ;*
  this.richTextBox1.Name = "richTextBox1" ;HR
  this.richTextBox1.Size = new System.Drawing.Size ( 336 , 264 ) ;.k`/%
  this.richTextBox1.TabIndex = 0 ;jbKg
  this.richTextBox1.Text = "" ;2:+
<<
this.button1.Location = new System.Drawing.Point ( 128 , 304 ) ;T-JsKw
  this.button1.Name = "button1" ;#dnK&
  this.button1.Size = new System.Drawing.Size ( 128 , 24 ) ;_+R:]U
  this.button1.TabIndex = 1 ;d^D-
  this.button1.Text = "获得剪切板中的数据" ;M
  this.button1.Click += new System.EventHandler ( this.button1_Click ) ;5BEhF
S7p
this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;=j>
  this.ClientSize = new System.Drawing.Size ( 408 , 357 ) ;SZU2D
  this.Controls.Add ( button1 );-Jr
  this.Controls.Add ( richTextBox1 );vzws?
  this.Name = "form1";vUd2J
  this.Text = "用Visual C#来保存剪切板中的数据!";YvQg
  this.ResumeLayout(false);0f
&IZz[
} y5
  static void Main ( ) Tq_b
  { s&/4M
  Application.Run ( new form1 ( ) ) ;)SFIN
  } ;ZP
  private void button1_Click ( object sender , System.EventArgs e )y
  { //定义一个IDataObject接口/*bnP
  IDataObject d = Clipboard.GetDataObject ( ) ;.3qw
  //如果剪切板中数据是位图,则另存为C盘的my.bmp文件ZJo_hO
  if ( d.GetDataPresent ( Dataformats.Bitmap ) ) Nq
  { X|/
  //出箱-
  Bitmap b = ( Bitmap ) d.GetData ( Dataformats.Bitmap ) ;`6
  b.Save ( @"c:/my.bmp" ) ;MM
  MessageBox.Show ( "当前剪切板内容是位图,已经保存到"MY.BMP"文件中!" ) ;obb
  } //如果是文本,则用窗体中的RichText组件显示文本内容。2
  else if ( d.GetDataPresent ( Dataformats.Text ) ) kzhk
  { 1<4F6@
  //出箱C,x
  String c = ( String ) d.GetData ( Dataformats.Text ) ; WC<C
  richTextBox1.Text = c ;lu`%iZ
  } 6L6l'w
  else 7:
  { ^8)
  MessageBox.Show ( "剪切板中是其它类型的数据!" ) ;}=
  } H
  } h(Kx
  } G&`
N2EV
七. 总结bK
in4Q9
本文介绍了在用Visual C#进行剪切板编程的二个重要方面的内容,即:判定剪切板中的数据和保存剪切板中的数据。其实针对剪切板的编程用途是比较广的,譬如有了上面的知识做铺垫,我想如果要你用Visual C#开发一个抓图程序,你一定不会说很难吧!

VB.NET实现Windows剪贴板监视器

Windows剪贴板剪贴板(ClipBoard)是内存中的一块区域,是Windows内置的一个非常有用的工具,通过小小的剪贴板,架起了一座彩桥,使得在各种应用程序之间,传递和共享信息成为可能。然而美中...
  • testcs_dn
  • testcs_dn
  • 2014年12月25日 14:43
  • 3855

c#实现Windows剪贴板监视器

Windows剪贴板剪贴板(ClipBoard)是内存中的一块区域,是Windows内置的一个非常有用的工具,通过小小的剪贴板,架起了一座彩桥,使得在各种应用程序之间,传递和共享信息成为可能。然而美中...
  • testcs_dn
  • testcs_dn
  • 2015年01月03日 18:18
  • 6558

Java的多线程 简单入门

Java的多线程 简单入门   首先可以先搞清楚什么是程序、进程、线程,以及它们之间的关系: 定义: 一 程序只是一组指令的有序集合,它是静态的 二 进程是具有一定独立...
  • yagamil
  • yagamil
  • 2014年11月08日 09:13
  • 1345

C# 操作剪贴板

 //将非持久性数据置于系统剪贴板中。 Clipboard.SetDataObject("这条信息置于剪切板中,相当于Ctrl+C"); //获取剪切板中文本格式的内容,相当于Ctrl+V(...
  • jsjyyjs07
  • jsjyyjs07
  • 2015年07月16日 22:11
  • 2886

什么情况下用多线程编程

CPU是以时间片的方式为进程分配CUP处理时间的,当一个进程以同步的方式去完成几件事情时,此进程必须完成了第一件事情以后再做第二件事,如此按顺序 地向CPU请求完成要做的事情。在此单线程的工作模式下,...
  • weidan0302
  • weidan0302
  • 2014年06月11日 14:58
  • 780

C#如何保存剪贴板内容,在使用后恢复。

C# clipboard类封装了对剪贴板的操作,一般使用没有问题。但由于clipboard封装的数据类型有限,对于一些自定义类型的剪贴板数据,如果想占用剪贴板并在使用后原样恢复剪贴板的数据就会产生问题...
  • vencon_s
  • vencon_s
  • 2015年06月03日 14:25
  • 995

C#剪切板编程操作图片、音乐、txt==文件(神样的代码,找了好久)

来源1:http://www.cnblogs.com/webcyz/archive/2011/06/29/2092946.html
  • u012744024
  • u012744024
  • 2014年03月13日 17:25
  • 840

C#中使用系统剪切板

在C#中,我们可以使用静态类System.Windows.Clipboard 来使用系统剪切板复制和剪切内容。 Clipboard.SetText函数,向剪切板中插入内容,将制定的内容添加到剪切板; ...
  • Libby1984
  • Libby1984
  • 2017年06月06日 09:03
  • 550

在剪切板中使用自定义格式的数据

void TestManualFormatClipboard() { //自定义数据结构体 typedef struct _MYSTRUCT { CHAR charV...
  • zgl7903
  • zgl7903
  • 2013年04月08日 12:50
  • 2297

Kotlin編程⇒人机交互

展示的是从键盘录入数据,然后计算机转换为int类型,然后执行相加、相減、相乗、相除的计算 package test //!!两个感叹号表示一定不为空 fun main(args: Array) {...
  • always007
  • always007
  • 2017年10月31日 09:23
  • 84
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Visual C#的剪切板編程(转)
举报原因:
原因补充:

(最多只允许输入30个字)