编程实现对剪贴板的监视

来源:互联网 发布:php memcached 扩展 编辑:程序博客网 时间:2024/06/07 09:52

                     编程实现对剪贴板的监视
                                                     作者 陈锐

  可能有很多电脑使用者使用过剪贴板来监视软件,该软件可以 将剪贴板的每次变化保存起来,以便使用者随时调用,下面就介绍 怎样用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.  

 

厦门市 崇明县 龙岩市 长治市 晋城市 忻州地区 吕梁地区 晋中地区 临汾地区 蚌埠市 其它地区 南市区 安顺地区 徐汇区 其它地区 静安区 宝鸡市 其它地区 七台河市 扬州市 闵行区 宝山区 嘉定区 浦东新区 金山区 静海县 九江市 青浦县 黔西南布依族苗族自治州 松江区 宁河县 门头沟 吉林市 顺义区 天水市 河源市
原创粉丝点击