Windows使用剪貼板觀察器和觀察鏈。剪貼板觀察器是一個(gè)顯示剪貼板當(dāng)前內(nèi)容的窗口。通常它應(yīng)該至少能顯示三種普通格式的內(nèi)容:文字CF_TEXT、位圖CF_BITMAP、元文件CF_METAFILEPICT。剪貼板觀察鏈?zhǔn)且幌盗邢嗷オ?dú)立的剪貼板觀察窗口,它們都能夠接受當(dāng)前發(fā)送到剪貼板的內(nèi)容。我們大致按照以下步驟在窗口中處理有關(guān)剪貼板的內(nèi)容。 首先,使用SetClipboardViewer(HWND)函數(shù)向剪貼板觀察鏈中加入一個(gè)觀察窗口。當(dāng)剪貼板的內(nèi)容發(fā)生變化時(shí),該窗口會(huì)接收到一個(gè)WM_DRAWCLIPBOARD消息。該函數(shù)需要傳遞的參數(shù)是觀察窗口的句柄。返回值也是一個(gè)窗口句柄類型,標(biāo)識(shí)了將要加入的下一個(gè)窗口。 然后,響應(yīng)WM_DRAWCLIPBOARD消息處理剪貼板內(nèi)容的變化。 最后,在程序退出或關(guān)閉時(shí)需要調(diào)用ChangeClipboardChain函數(shù)來(lái)將自己從觀察鏈中刪除。然后調(diào)用SendMessage函數(shù)把這些消息傳遞到觀察鏈中的下一個(gè)觀察窗口。函數(shù)ChangeClipboardChain原型如下: BOOL ChangeClipboardChain( HWND hWndRemove, //將要?jiǎng)h除的窗口的句柄 HWND hWndNewNext //觀察鏈中下一個(gè)窗口的句柄 ); Delphi的clipbrd.pas單元中定義了一個(gè)類TClipboard,它封裝了Windows剪貼板,簡(jiǎn)化了大量復(fù)雜的處理過(guò)程。我們?cè)诔绦蛑锌梢灾苯诱{(diào)用全局函數(shù)Clipboard,該函數(shù)用于返回TClipboard對(duì)象實(shí)例,使用這個(gè)實(shí)例對(duì)剪貼板進(jìn)行剪切、復(fù)制和粘貼等操作。下面是TClipboard對(duì)象的幾個(gè)常用的方法和屬性的簡(jiǎn)單介紹。 方法: Assign:將指定的對(duì)象放入剪貼板中。 Open:打開(kāi)剪貼板,防止其他程序改寫剪貼板。在向剪貼板加入多項(xiàng)數(shù)據(jù)時(shí)尤其有用。 Close:關(guān)閉剪貼板。應(yīng)該與打開(kāi)剪貼板成對(duì)使用。 Clear:清空剪貼板。 GetAsHandle:返回剪貼板中指定格式數(shù)據(jù)的句柄。使用前必須打開(kāi)剪貼板。 GetComponent:返回剪貼板中的一個(gè)控件。Delphi自己使用得多。 HasFormat:查詢剪貼板中是否有指定格式的內(nèi)容。 屬性: AsText:用于讀寫剪貼板文字內(nèi)容。 FormatCount:讀剪貼板中數(shù)據(jù)格式的種數(shù)。 Formats:返回剪貼板中各種格式的列表。 此外,Delphi中的許多控件中也封裝了有關(guān)剪貼板處理的操作。下面的一個(gè)處理剪貼板的簡(jiǎn)單例子,只是將剪貼板的文字內(nèi)容顯示為窗口標(biāo)題。 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Clipbrd;//加入clipbrd單元 type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public NextClipHwnd:HWND;//觀察鏈中下一個(gè)窗口句柄 procedure WMDrawClipBoard (var AMessage:TMessage); message WM_DRAWCLIPBOARD; //處理WM_DRAWCLIPBOARD消息過(guò)程 end; var Form1: TForm1; implementation {$R *.DFM} { TForm1 } procedure TForm1.WMDrawClip Board(var AMessage: TMessage); begin //將WM_DRAWCLIPBOARD 消息傳遞到下一個(gè)觀察鏈中的窗口 SendMessage(NextClipHwnd,AMessage. Msg,AMessage.WParam,AMessage.LParam); //查詢剪貼板中特定格式的數(shù)據(jù)內(nèi)容 if (Clipboard.HasFormat(CF_TEXT) or Clipboard.HasFormat(CF_OEMTEXT)) then begin //處理剪貼板中內(nèi)容 Caption:=Clipboard.asText; end; end; procedure TForm1.FormCreate(Sender: TObject); begin //獲得觀察鏈中下一個(gè)窗口句柄 NextClipHwnd:=SetClipBoardViewer(Handle); end; procedure TForm1.FormClose (Sender: TObject; var Action: TCloseAction); begin //從觀察鏈中刪除本觀察窗口 ChangeClipboardChain(Handle,NextClipHwnd); //將WM_DRAWCLIPBOARD 消息傳遞到下一個(gè)觀察鏈中的窗口 SendMessage(NextClipHwnd,WM_ CHANGECBCHAIN,Handle,NextClipHwnd); end; end. 需要注意的是,在處理剪貼板內(nèi)容變化的消息WM_DRAWCLIPBOARD的過(guò)程和關(guān)閉窗口事件中使用函數(shù)sendmessage把WM_DRAWCLIPBOARD或WM_CHANGECBCHAIN消息傳遞到觀察鏈中的下一個(gè)窗口是必要的,否則有可能其他窗口不能獲得類似消息。另外,在使用網(wǎng)絡(luò)螞蟻時(shí)筆者曾經(jīng)碰到不能設(shè)置剪貼板格式的情況,在此提醒讀者注意檢查RegisterClipboardFormat等函數(shù)的返回值。 |
|