編程實現對剪貼板的監視

                     編程實現對剪貼板的監視
                                                     作者 陳銳

  可能有很多電腦使用者使用過剪貼板來監視軟件,該軟件可以 將剪貼板的每次變化保存起來,以便使用者隨時調用,下面就介紹 怎樣用Delphi編程來實現對剪貼板進行監視的功能。
  在Windows中,有一個剪貼板觀察鏈(Chain of Clipboard Viewers),當剪貼板的內容每次發生改變時,Windows都會向剪貼板 觀察鏈中所有的窗口發送WM_DRAWCLIPBOARD消息。通過Windows API 函數SetClipboardViewer可以將窗口設置到剪貼板觀察鏈中,然後 在程序中編寫WM_DRAWCLIPBOARD消息處理函數就可以基本實現對剪 貼板的監視功能了,在退出程序時,要調用ChangeClipboardChain 函數,以便將窗口從剪貼板監視鏈中刪除。
  Delphi中提供了一個TClipboard控件,可以實現一些需要進行 複雜的Windows API編程才能實現的功能。而且,Delphi中的文本和 圖形控件提供了比VB中的類似控件更強大的剪貼板操作功能。同 時,Delphi中雖然沒有提供WM_DRAWCLIPBOARD事件,但是,Delphi 提供了一個像C++一樣讓編程人員可以自由地編寫用戶自定義函數的 功能,這樣,編程人員就可以編寫自定義函數來處理Delphi中沒有 提供的消息了,從而可以方便地監視剪貼板的每一次變化了。
  嘉峪關市 烏蘭察布 玉溪市 麗江地區 雙鴨山市 孝感市 臨滄地區 宣城 神農架林區 甘南藏族自治州 大興安嶺 大理白族自治州 通什市 紅河哈尼族彝族自治州 其它地區 甘孜藏族自治州 保亭黎族苗族自治縣 張家口 秦皇島 承德市 武威地區 廊坊市 朔州市 滄州市 衡水市 房山區 吉安市 其它地區 密雲縣 昌平縣 其它地區 化工  具體實現對剪貼板的監視功能的源代碼見右邊程序,首先要在 Form1中加入一個TMemo控件和一個TImage控件,不需要改變它們的 屬性。
  該程序在Win 95、Delphi 4.0下運行通過。PCC
  unit Unit1;
  interface
  uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   ExtCtrls,Clipbrd, StdCtrls;
  type
   TForm1 = class(TForm)
   Image1: TImage;
   Memo1: TMemo;
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   private
   procedure WMDrawClip(var Message:TMessage);message WM_DRAWCLIPBOARD;
   { Private declarations }
   public
   { Public declarations }
   end;
  var
   Form1: TForm1;
   hwndNextClip:integer;
   //保存下一個接受剪貼板消息的窗口的句柄
  implementation
  {$R *.DFM}
  procedure TForm1.WMDrawClip(var Message:TMessage);
  begin
   //將剪貼板消息發送到觀察鏈上的下一個窗口
   SendMessage(hwndNextClip,Message.Msg,Message.WParam ,Message.LParam );
   if(Clipboard.HasFormat(CF_TEXT) or Clipboard.HasFormat(CF_OEMTEXT)) then
   //剪貼板上的內容是文本格式
   begin
   //設置Memo1接收文本
   Memo1.Align:= alClient;
   Memo1.Visible :=True;
   Image1.Visible := False;
   //將剪貼板的內容粘貼到文本框中
   Memo1.PasteFromClipboard;
   end;
   if Clipboard.HasFormat(CF_BITMAP) then
   //剪貼板上的內容是位圖格式
   begin
   //設置Image1接收位圖
   Image1.Align:= alClient;
   Memo1.Visible :=False;
   Image1.Visible := True;
   //將剪貼板內容粘貼到圖片框中
   Image1.Picture.LoadFromClipboardFormat(CF_BITMAP,ClipBoard.GetAsHandle(CF_BITMAP),0);
   end;
  end;
  procedure TForm1.FormCreate(Sender: TObject);
  begin
   //把窗口設置到剪貼板查看鏈上
   hwndNextClip:=SetClipboardViewer(Form1.Handle);
  end;
  procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  begin
   //將窗口從剪貼板觀察鏈中刪除
   ChangeClipboardChain(Form1.Handle,hwndNextClip);
   SendMessage(hwndNextClip,WM_CHANGECBCHAIN,Form1.Handle ,hwndNextClip);
  end;
  end.

_____________________________________________________________________________________
在D7.0中測試通過
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ExtCtrls,Clipbrd, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Image1: TImage;
    procedure WMDrawClip(var Message:TMessage);message WM_DRAWCLIPBOARD;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  hwndNextClip:integer;
implementation

{$R *.dfm}

procedure TForm1.WMDrawClip(var Message:TMessage);
begin
//將剪貼板消息發送到觀察鏈上的下一個窗口
SendMessage(hwndNextClip,Message.Msg,Message.WParam ,Message.LParam );
if(Clipboard.HasFormat(CF_TEXT) or Clipboard.HasFormat(CF_OEMTEXT)) then
//剪貼板上的內容是文本格式
begin
//設置Memo1接收文本
Memo1.Align:= alClient;
Memo1.Visible :=True;
Image1.Visible := False;
//將剪貼板的內容粘貼到文本框中
Memo1.PasteFromClipboard;
end;
if Clipboard.HasFormat(CF_BITMAP) then
//剪貼板上的內容是位圖格式
begin
//設置Image1接收位圖
Image1.Align:= alClient;
Memo1.Visible :=False;
Image1.Visible := True;
//剪貼板內容粘貼到圖片框中
Image1.Picture.LoadFromClipboardFormat(CF_BITMAP,ClipBoard.GetAsHandle(CF_BITMAP),0);
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
//把窗口設置到剪貼板查看鏈上
hwndNextClip:=SetClipboardViewer(Form1.Handle);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 //將窗口從剪貼板觀察鏈中刪除
ChangeClipboardChain(Form1.Handle,hwndNextClip);
SendMessage(hwndNextClip,WM_CHANGECBCHAIN,Form1.Handle ,hwndNextClip);
end;

end.  

 

廈門市 崇明縣 龍巖市 長治市 晉城市 忻州地區 呂梁地區 晉中地區 臨汾地區 蚌埠市 其它地區 南市區 安順地區 徐彙區 其它地區 靜安區 寶雞市 其它地區 七臺河市 揚州市 閔行區 寶山區 嘉定區 浦東新區 金山區 靜海縣 九江市 青浦縣 黔西南布依族苗族自治州 松江區 寧河縣 門頭溝 吉林市 順義區 天水市 河源市
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章