本文介紹了如何使用Visual C#操作剪切板的方法,講的非常到位,大家如果想用C#操作剪切板,不妨參照一下這個(gè)文章。
Visual C#是微軟.Net框架中的一個(gè)重要的程序開(kāi)發(fā)語(yǔ)言,雖然在.Net框架中還有其他的程序開(kāi)發(fā)語(yǔ)言,但微軟似乎對(duì)Visual C#更喜愛(ài)有加。這同時(shí)也就決定了Visual C#在.Net框架中的地位,以及他以后的發(fā)展前途。由于針對(duì)剪切板方面的編程始終是程序設(shè)計(jì)的一個(gè)重點(diǎn),當(dāng)然也可以算是一個(gè)難點(diǎn)。本文將探討如何利用Visual C#進(jìn)行剪切板編程。本文將結(jié)合二個(gè)具體的程序例子來(lái)介紹Visual C#剪切板編程的二個(gè)重要方面:判定剪切板中的數(shù)據(jù)類型、保存剪切板中的數(shù)據(jù)。首先來(lái)介紹Visual C#如何判定剪切板中的數(shù)據(jù)類型的。
剪切板中可以存放許多類型的數(shù)據(jù),而Visual C#可以判定剪切板中的數(shù)據(jù)類型大致有21種,這其中包括位圖(Bitmap)、文本(Text)、超文本(Html)等,由于類型比較將多,本文將只介紹比較典型的數(shù)據(jù)類型,對(duì)于其他的數(shù)據(jù)類型,操作方法基本類似。
1、本文程序設(shè)計(jì)和運(yùn)行的環(huán)境:
(1)微軟公司視窗2000服務(wù)器版
(2).Net FrameWork SDK Beta 2
2、 介紹程序中使用到的類和接口:
Visual C#判斷剪切板中的數(shù)據(jù)類型,要使用到.Net FrameWork SDK中二個(gè)類(Class)和一個(gè)接口(Interface),具體的就是:Clipboard類、DataFormats類和IdataObject接口。這三者的作用是:Clipboard類是一個(gè)不可以繼承的類,他的主要作用是通過(guò)自身的方法來(lái)實(shí)現(xiàn)在計(jì)算機(jī)系統(tǒng)的剪切板中存放和獲得數(shù)據(jù)。DataFormats類主要是提供了一個(gè)預(yù)先設(shè)定好的剪切板數(shù)據(jù)類型,并可以被IdataObject接口調(diào)用來(lái)判定剪切板數(shù)據(jù)類型。IdataObject接口提供了一個(gè)zi you格式的裝置來(lái)傳輸數(shù)據(jù)。下面就結(jié)合這些類和接口來(lái)具體看一下,具體的使用方法。
3、Visual C#判定剪切板數(shù)據(jù)類型的解決思路以及重要步驟的解決辦法:
(1)首先要讀取剪切板中的數(shù)據(jù)內(nèi)容:
Clipboard類中有一個(gè)方法叫GetDataObject ( ),此方法的作用就是讀取當(dāng)前剪切板中的數(shù)據(jù)內(nèi)容。要把讀取了當(dāng)前剪切板中數(shù)據(jù)存放起來(lái),這就要用到IdataObject接口,這個(gè)接口可以使用在Clipboard類和Drag and Drop的操作中。下面這些代碼就是讀取把當(dāng)前剪切板中的數(shù)據(jù)內(nèi)容并存放起來(lái)。
IDataObject d = Clipboard.GetDataObject ( ) ;
(2)判定當(dāng)前剪切板中的數(shù)據(jù)類型:
在IdataObject接口中有一個(gè)方法名稱是GetDataPresent ( ),這個(gè)方法的作用是檢測(cè)存放在接口的數(shù)據(jù)是否是指定的數(shù)據(jù)類型或者可以轉(zhuǎn)換成指定的數(shù)據(jù)類型。他的返回值是布爾型,True表示為指定的數(shù)據(jù)類型或者可以轉(zhuǎn)換成指定的數(shù)據(jù)類型。False于上面意思相反。下面語(yǔ)句實(shí)現(xiàn)的功能是判定當(dāng)前剪切板的數(shù)據(jù)內(nèi)容是否為位圖、文本和超文本的,具體如下:
if ( d.GetDataPresent ( DataFormats.Bitmap ) )
{
Console.WriteLine ( "當(dāng)前剪切板中的數(shù)據(jù)類型是位圖!" ) ;
}
else if ( d.GetDataPresent ( DataFormats.Text ) )
{
Console.WriteLine ( "當(dāng)前剪切板中的數(shù)據(jù)類型是文本!" ) ;
}
else if ( d.GetDataPresent ( DataFormats.Html ) )
{
Console.WriteLine ( "當(dāng)前剪切板中的數(shù)據(jù)類型是超文本!" ) ;
}
else
{
Console.WriteLine ( "當(dāng)前剪切板中的數(shù)據(jù)類型是其他類型數(shù)據(jù)!" ) ;
}
4、程序源代碼:
通過(guò)上面的介紹,我們不難理解下面這些程序代碼,這些程序代碼的功能就是判定當(dāng)前剪切板中的數(shù)據(jù)是什么類型。具體如下:
using System ;
using System.Windows.Forms ;
public class MyClipboard
{
public static void Main ( string [ ] args )
{
IDataObject d = Clipboard.GetDataObject ( ) ;
if ( d.GetDataPresent ( DataFormats.Bitmap ) ) {
Console.WriteLine ( "當(dāng)前剪切板中的數(shù)據(jù)類型是位圖!" ) ;
} else if ( d.GetDataPresent ( DataFormats.Text ) ) {
Console.WriteLine ( "當(dāng)前剪切板中的數(shù)據(jù)類型是文本!" ) ;
} else if ( d.GetDataPresent ( DataFormats.Html ) ) {
Console.WriteLine ( "當(dāng)前剪切板中的數(shù)據(jù)類型是超文本!" ) ;
} else {
Console.WriteLine ( "當(dāng)前剪切板中的數(shù)據(jù)類型是其他類型數(shù)據(jù)!" ) ;
}
}
}
5、Visual C#保存剪切板數(shù)據(jù)的解決思路以及重要步驟的解決辦法:
用Visual C#保存剪切板中的數(shù)據(jù)要使用的類和接口和判定剪切板中的數(shù)據(jù)類型基本一樣。但由于要讀取剪切板數(shù)據(jù),就需要用到了IdataObject接口的方法GetData ( ),這個(gè)方法的作用就是獲得指定類型的數(shù)據(jù)內(nèi)容。他的語(yǔ)法為:
object GetData ( Type ) ;
我們注意到這個(gè)方法返回的類型是一個(gè)Object類型,這是一個(gè)參考類型,他的變量就是一個(gè)參考類型變量,而我們讀取的內(nèi)容應(yīng)該是一個(gè)實(shí)值類型變量,這就又涉及到裝箱和出箱的問(wèn)題了。由于在前面的文章中已經(jīng)比較詳細(xì)的說(shuō)明了這二者的關(guān)系(見(jiàn)《用Visual C#動(dòng)態(tài)生成組件》),所以在本文就不介紹了。在本文的程序中是通過(guò)下列二行語(yǔ)句來(lái)實(shí)現(xiàn)這種由參考類型變量轉(zhuǎn)換成實(shí)值類型變量的過(guò)程:
Bitmap b = ( Bitmap ) d.GetData ( DataFormats.Bitmap ) ;//位圖
String c = ( String ) d.GetData ( DataFormats.Text ) ;//文本
實(shí)現(xiàn)保存剪切板中數(shù)據(jù)的程序的設(shè)計(jì)思路是,首先判定當(dāng)前剪切板中的數(shù)據(jù)類型,如果數(shù)據(jù)類型為位圖,則保存到C盤(pán)的"my.bmp"文件中,如果數(shù)據(jù)類型是文本,則用一個(gè)RichText組件顯示出來(lái)。否則則提示是其他類型數(shù)據(jù)。下圖就是程序?qū)崿F(xiàn)上述功能的截圖:

圖01:數(shù)據(jù)類型為位圖的時(shí)候,程序運(yùn)行界面

圖02:數(shù)據(jù)類型為文本時(shí)程序運(yùn)行界面
如何判定剪切板數(shù)據(jù)類型在上面已經(jīng)介紹過(guò)了,程序的另外一個(gè)難點(diǎn)就是,假定已經(jīng)判定剪切板中的數(shù)據(jù)類型為位圖,如何保存數(shù)據(jù)。在程序中是通過(guò)名稱空間System.Windows.Forms中的Bitmap類的Save ( )方法來(lái)實(shí)現(xiàn)的。下列語(yǔ)句就是具體的實(shí)現(xiàn)方法。
Bitmap b = ( Bitmap ) d.GetData ( DataFormats.Bitmap ) ;
b.Save ( @"c:/my.bmp" ) ;
MessageBox.Show ( "當(dāng)前剪切板內(nèi)容是位圖,已經(jīng)保存到"MY.BMP"文件中!" ) ;
6、 用Visual C#讀取當(dāng)前剪切板中數(shù)據(jù)內(nèi)容并保存的程序源代碼:
通過(guò)上面的介紹,可以得到實(shí)現(xiàn)上述功能的源程序代碼,如下:
using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data;
public class Form1 : Form
{
private RichTextBox richTextBox1 ;
private Button button1 ;
private System.ComponentModel.Container components = null ;
public Form1()
{
//初始化窗體中的各個(gè)組件
InitializeComponent ( ) ;
}
//清除程序中使用過(guò)的資源
protected override void Dispose ( bool disposing )
{
if ( disposing )
{
if ( components != null )
{
components.Dispose ( ) ;
}
}
base.Dispose ( disposing );
}
private void InitializeComponent ( )
{
this.richTextBox1 = new RichTextBox ( ) ;
this.button1 = new Button ( ) ;
this.SuspendLayout ( ) ;
this.richTextBox1.Location = new System.Drawing.Point ( 40 , 16 ) ;
this.richTextBox1.Name = "richTextBox1" ;
this.richTextBox1.Size = new System.Drawing.Size ( 336 , 264 ) ;
this.richTextBox1.TabIndex = 0 ;
this.richTextBox1.Text = "" ;
this.button1.Location = new System.Drawing.Point ( 128 , 304 ) ;
this.button1.Name = "button1" ;
this.button1.Size = new System.Drawing.Size ( 128 , 24 ) ;
this.button1.TabIndex = 1 ;
this.button1.Text = "獲得剪切板中的數(shù)據(jù)" ;
this.button1.Click += new System.EventHandler ( this.button1_Click ) ;
this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;
this.ClientSize = new System.Drawing.Size ( 408 , 357 ) ;
this.Controls.Add ( button1 );
this.Controls.Add ( richTextBox1 );
this.Name = "Form1";
this.Text = "用Visual C#來(lái)保存剪切板中的數(shù)據(jù)!";
this.ResumeLayout(false);
} static void Main ( )
{
Application.Run ( new Form1 ( ) ) ;
}
private void button1_Click ( object sender , System.EventArgs e )
{ //定義一個(gè)IDataObject接口
IDataObject d = Clipboard.GetDataObject ( ) ;
//如果剪切板中數(shù)據(jù)是位圖,則另存為C盤(pán)的my.bmp文件
if ( d.GetDataPresent ( DataFormats.Bitmap ) )
{
//出箱
Bitmap b = ( Bitmap ) d.GetData ( DataFormats.Bitmap ) ;
b.Save ( @"c:/my.bmp" ) ;
MessageBox.Show ( "當(dāng)前剪切板內(nèi)容是位圖,已經(jīng)保存到"MY.BMP"文件中!" ) ;
} //如果是文本,則用窗體中的RichText組件顯示文本內(nèi)容。
else if ( d.GetDataPresent ( DataFormats.Text ) )
{
//出箱
String c = ( String ) d.GetData ( DataFormats.Text ) ;
richTextBox1.Text = c ;
}
else
{
MessageBox.Show ( "剪切板中是其他類型的數(shù)據(jù)!" ) ;
}
}
}
7、 總結(jié):
本文介紹了在用Visual C#進(jìn)行剪切板編程的二個(gè)重要方面的內(nèi)容,即:判定剪切板中的數(shù)據(jù)和保存剪切板中的數(shù)據(jù)。其實(shí)針對(duì)剪切板的編程用途是比較廣的,譬如有了上面的知識(shí)做鋪墊,我想如果要你用Visual C#開(kāi)發(fā)一個(gè)抓圖程序,你一定不會(huì)說(shuō)很難吧!
使用Visual C#操作剪切板看來(lái)并復(fù)雜,主要得有思路。
新聞熱點(diǎn)
疑難解答