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;
}