建议使用剪贴板操作。
不过我说的前提不是的别的程序中选择了文本,而是必须选择文本并对其进行复制。
首先可考虑使用简单一点的方法:即通过WINDOWS的消息,自动感知剪贴板,也就是说,
只要别的程序中复制了文本(即剪贴板上有的新的文本内容),你就可以通过获取剪贴
板的消息,获取剪贴板中的文本。
下面是一个小程序的说明源代码:
假设我们的窗体上,有三个Tbutton组件,分别用于完成复制、剪切、粘贴等操作。如果单击"复制"按钮完
成复制功能后,因为剪贴板中的了东西,我们可以把"粘贴"按钮设为可用,这是一件很容易的事。但是我们通
常会发现,当有多个程序运行时,在其中一个程序中使用了复制功能,则在另一个应用程序中的编辑菜单中的
"粘贴"菜单项会自动变成有效。显然,在该应用程序中,能够自动感知剪贴板发生了变化,那么又是实现的呢?
为了使应用程序能自动的感知剪贴板的更改,首先应当将应用程序的窗体注册到剪贴板观测链中,然后使
应用程序能响应剪贴板的更改消息并对这些消息进行处理,最后当然不要忘了将该窗体从剪贴板观测链中移去。
为了在剪贴板观测链中注册应用程序的窗体,需调用Win32 API函数SetClipBoardviewer。
SetClipBoardviewer的定义格式为:
function SetClipBoardviewer(hwndnewviewer;hwnd):hwnd;
hwdnnewviewer参数表示要注册的窗体句柄。
如果函数执行成功,返回剪贴板中下一个窗体的句柄。如果发生错误或在剪贴板观测链中无其他窗体,则
返回NULL。
注册了窗体后,下一步就是捕获剪贴板变化的消息并进行处理。如果剪贴板发生了变化,则Windows会向剪
贴板观测链中的窗体发送WM_changecbchain消息或者WM_DRAWCLIPBOARD消息。因此可以定义相应的消息处理过程
来实现。
最后,我们可以用ChangeClipboardChain()函数移去剪贴板观测链中的窗体。
下面的代码清单详细的说明了如何自动感知剪贴板的变化。
unit AutoClipBrd;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls,clipbrd;
type
TForm1 = class(Tform)
Memo: Tmemo;
ButtonCut: Tbutton;
ButtonCopy: Tbutton;
ButtonPaste: Tbutton;
Image: Timage;
procedure ButtonCutClick(Sender: Tobject);
procedure ButtonCopyClick(Sender: Tobject);
procedure ButtonPasteClick(Sender: Tobject);
procedure FormShow(Sender: Tobject);
procedure FormClose(Sender: Tobject; var Action: TCloseAction);
public
nextClipViewHdle:hwnd;
procedure wmdrawClipboard(var msg:twmdrawclipboard);
message wm_drawClipboard;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ButtonCutClick(Sender: Tobject);
begin
clipboard.Assign(image.picture.bitmap);//复制图形到剪贴板
image.Picture.Assign(nil);//清空图形
end;
procedure TForm1.ButtonCopyClick(Sender: Tobject);
begin
clipboard.Assign(image.picture.bitmap);//复制图形到剪贴板
end;
procedure TForm1.ButtonPasteClick(Sender: Tobject);
begin
if clipboard.HasFormat(cf_bitmap) then
begin//如果剪贴板格式为位图,则放入图像组件中
image.Picture.bitmap.Assign(clipboard);
buttonpaste.Enabled :=false;
end
else if clipboard.HasFormat(cf_text) then
begin//如果剪贴板格式为文本,则放入Memo组件中
memo.PasteFromClipboard;
buttonpaste.Enabled :=false;
end;
end;
//该过程自动感知剪贴板
procedure tform1.wmdrawClipboard(var msg:twmdrawclipboard);
begin
if clipboard.HasFormat(cf_text) or clipboard.HasFormat(cf_bitmap) then
buttonpaste.Enabled :=true
else
buttonpaste.Enabled :=false;
end;
procedure TForm1.FormShow(Sender: Tobject);
begin
if clipboard.HasFormat(cf_text) or clipboard.HasFormat(cf_bitmap) then
buttonpaste.Enabled :=true
else
buttonpaste.Enabled :=false;
//将本窗体注册到剪贴板观链中
nextclipviewhdle:=setclipboardviewer(handle);
end;
procedure TForm1.FormClose(Sender: Tobject; var Action: TCloseAction);
begin
//将本窗体从剪贴板观测链中移去
changeclipboardchain(handle,nextclipviewhdle);
end;
end.
下面说明第二种剪贴板的方法
注:该文件出于
http://fxdfbl.51.net/files/onefile.php?file_id=17