| 導購 | 订阅 | 在线投稿
分享
 
 
 

監視剪貼板內容

來源:互聯網  2008-06-01 01:54:59  評論

沖浪的年代,用過網絡螞蟻的人肯定不少,其中一項監視剪貼板變化的功能讓人 感覺到不少體貼。本文將介紹在Delphi中如何使用「體貼板」,來豐富自己的軟件功能。

Windows使用剪貼板觀察器和觀察鏈。剪貼板觀察器是一個顯示剪貼板當前內容的窗口。通常它應該至少能顯示三種普通格式的內容:文字CF_TEXT、位圖CF_BITMAP、元文件CF_METAFILEPICT。剪貼板觀察鏈是一系列相互獨立的剪貼板觀察窗口,它們都能夠接受當前發送到剪貼板的內容。我們大致按照以下步驟在窗口中處理有關剪貼板的內容。

首先,使用SetClipboardViewer(HWND)函數向剪貼板觀察鏈中加入一個觀察窗口。 當剪貼板的內容發生變化時,該窗口會接收到一個WM_DRAWCLIPBOARD消息。該函數需要傳遞的參數是觀察窗口的句柄。返回值也是一個窗口句柄類型,標 識了將要加入的下一個窗口。

然後,響應WM_DRAWCLIPBOARD消息處理剪貼板內容的變化。

最後,在程序退出或關閉時需要調用ChangeClipboardChain函數來將自己從觀察鏈中 刪除。然後調用SendMessage函數把這些消息傳遞到觀察鏈中的下一個觀察窗口。函數ChangeClipboardChain原型如下: BOOL ChangeClipboardChain(

HWND hWndRemove,//將要刪除的窗口的句柄

HWND hWndNewNext //觀察鏈中下一個窗口的句柄

);

Delphi的clipbrd.pas單元中定義了一個類TClipboard,它封裝了Windows剪貼板, 簡化了大量複雜的處理過程。我們在程序中可以直接調用全局函數Clipboard,該函數用于返回TClipboard對象實例,使用這個實例對剪貼板進行剪切、 複制和粘貼等操作。下面是TClipboard對象的幾個常用的方法和屬性的簡單介紹。

方法: Assign:將指定的對象放入剪貼板中。 Open:打開剪貼板,防止其他程序改寫剪貼板。在向剪貼板加入多項數據時尤其有用。Close:關閉剪貼板。應該與打開剪貼板成對使用。 Clear:清空剪貼板。 GetAsHandle:返回剪貼板中指定格式數據的句柄。使用前必須打開剪貼板。GetComponent:返回剪貼板中的一個控件。Delphi自己使用得多。 HasFormat:查詢剪貼板中是否有指定格式的內容。

屬性: AsText:用于讀寫剪貼板文字內容。 FormatCount:讀剪貼板中數據格式的種數。 Formats:返回剪貼板中各種格式的列表。 此外,Delphi中的許多控件中也封裝了有關剪貼板處理的操作。下面的一個處 理剪貼板的簡單例子,只是將剪貼板的文字內容顯示爲窗口標題。

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;//觀察鏈中下一個窗口句柄

procedure WMDrawClipBoard(var AMessage:TMessage);

message WM_DRAWCLIPBOARD;//處理WM_DRAWCLIPBOARD消息過程

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

{ TForm1 }

procedure TForm1.WMDrawClipBoard(var AMessage: TMessage);

begin

//將WM_DRAWCLIPBOARD消息傳遞到下一個觀察鏈中的窗口

SendMessage(NextClipHwnd,AMessage.Msg,AMessage.WParam,AMessage.LParam);

//查詢剪貼板中特定格式的數據內容

if (Clipboard.HasFormat(CF_TEXT)or Clipboard.HasFormat(CF_OEMTEXT)) then

begin

//處理剪貼板中內容

Caption:=Clipboard.asText;

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

//獲得觀察鏈中下一個窗口句柄

NextClipHwnd:=SetClipBoardViewer(Handle);

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

//從觀察鏈中刪除本觀察窗口

ChangeClipboardChain(Handle,NextClipHwnd);

//將WM_DRAWCLIPBOARD消息傳遞到下一個觀察鏈中的窗口

SendMessage(NextClipHwnd,WM_CHANGECBCHAIN,Handle,NextClipHwnd);

end;

end.

需要注重的是,在處理剪貼板內容變化的消息WM_DRAWCLIPBOARD的過程和關閉窗口事件中使用函數sendmessage把WM_DRAWCLIPBOARD或WM_CHANGECBCHAIN消息傳遞到觀察鏈中的下一個窗口是必要的,否則有可能其他窗口不能獲得類似消息。另外,在使用網絡螞蟻時筆者曾經碰到不能設置剪貼板格式的情況,在此提醒讀者注重檢查RegisterClipboardFormat等函數的返回值。

  沖浪的年代,用過網絡螞蟻的人肯定不少,其中一項監視剪貼板變化的功能讓人 感覺到不少體貼。本文將介紹在Delphi中如何使用「體貼板」,來豐富自己的軟件功能。   Windows使用剪貼板觀察器和觀察鏈。剪貼板觀察器是一個顯示剪貼板當前內容的窗口。通常它應該至少能顯示三種普通格式的內容:文字CF_TEXT、位圖CF_BITMAP、元文件CF_METAFILEPICT。剪貼板觀察鏈是一系列相互獨立的剪貼板觀察窗口,它們都能夠接受當前發送到剪貼板的內容。我們大致按照以下步驟在窗口中處理有關剪貼板的內容。   首先,使用SetClipboardViewer(HWND)函數向剪貼板觀察鏈中加入一個觀察窗口。 當剪貼板的內容發生變化時,該窗口會接收到一個WM_DRAWCLIPBOARD消息。該函數需要傳遞的參數是觀察窗口的句柄。返回值也是一個窗口句柄類型,標 識了將要加入的下一個窗口。   然後,響應WM_DRAWCLIPBOARD消息處理剪貼板內容的變化。   最後,在程序退出或關閉時需要調用ChangeClipboardChain函數來將自己從觀察鏈中 刪除。然後調用SendMessage函數把這些消息傳遞到觀察鏈中的下一個觀察窗口。函數ChangeClipboardChain原型如下: BOOL ChangeClipboardChain( HWND hWndRemove, //將要刪除的窗口的句柄 HWND hWndNewNext //觀察鏈中下一個窗口的句柄 );   Delphi的clipbrd.pas單元中定義了一個類TClipboard,它封裝了Windows剪貼板, 簡化了大量複雜的處理過程。我們在程序中可以直接調用全局函數Clipboard,該函數用于返回TClipboard對象實例,使用這個實例對剪貼板進行剪切、 複制和粘貼等操作。下面是TClipboard對象的幾個常用的方法和屬性的簡單介紹。   方法: Assign:將指定的對象放入剪貼板中。 Open:打開剪貼板,防止其他程序改寫剪貼板。在向剪貼板加入多項數據時尤其有用。Close:關閉剪貼板。應該與打開剪貼板成對使用。 Clear:清空剪貼板。 GetAsHandle:返回剪貼板中指定格式數據的句柄。使用前必須打開剪貼板。GetComponent:返回剪貼板中的一個控件。Delphi自己使用得多。 HasFormat:查詢剪貼板中是否有指定格式的內容。   屬性: AsText:用于讀寫剪貼板文字內容。 FormatCount:讀剪貼板中數據格式的種數。 Formats:返回剪貼板中各種格式的列表。   此外,Delphi中的許多控件中也封裝了有關剪貼板處理的操作。下面的一個處 理剪貼板的簡單例子,只是將剪貼板的文字內容顯示爲窗口標題。 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;//觀察鏈中下一個窗口句柄 procedure WMDrawClipBoard(var AMessage:TMessage); message WM_DRAWCLIPBOARD;//處理WM_DRAWCLIPBOARD消息過程 end; var Form1: TForm1; implementation {$R *.DFM} { TForm1 } procedure TForm1.WMDrawClipBoard(var AMessage: TMessage); begin //將WM_DRAWCLIPBOARD消息傳遞到下一個觀察鏈中的窗口 SendMessage(NextClipHwnd,AMessage.Msg,AMessage.WParam,AMessage.LParam); //查詢剪貼板中特定格式的數據內容 if (Clipboard.HasFormat(CF_TEXT)or Clipboard.HasFormat(CF_OEMTEXT)) then begin //處理剪貼板中內容 Caption:=Clipboard.asText; end; end; procedure TForm1.FormCreate(Sender: TObject); begin //獲得觀察鏈中下一個窗口句柄 NextClipHwnd:=SetClipBoardViewer(Handle); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin //從觀察鏈中刪除本觀察窗口 ChangeClipboardChain(Handle,NextClipHwnd); //將WM_DRAWCLIPBOARD消息傳遞到下一個觀察鏈中的窗口 SendMessage(NextClipHwnd,WM_CHANGECBCHAIN,Handle,NextClipHwnd); end; end.   需要注重的是,在處理剪貼板內容變化的消息WM_DRAWCLIPBOARD的過程和關閉窗口事件中使用函數sendmessage把WM_DRAWCLIPBOARD或WM_CHANGECBCHAIN消息傳遞到觀察鏈中的下一個窗口是必要的,否則有可能其他窗口不能獲得類似消息。另外,在使用網絡螞蟻時筆者曾經碰到不能設置剪貼板格式的情況,在此提醒讀者注重檢查RegisterClipboardFormat等函數的返回值。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有