一个关于文字拷贝的问题(50分)

L

Liulang

Unregistered / Unconfirmed
GUEST, unregistred user!
我想把在别的程序中选取的文字拷贝到我的程序中间啦,要用到什么办法,能不能给个例子,
谢谢
 
发送消息
 
可以使用剪贴板,在程序中加入对剪贴板内容的监视
 
问题是我只想用我自己定义的一个热键来弄回我的程序
 
金山词霸的样子?
用钩子。可以了。
应该CB也用了键盘钩子。
 
建议使用剪贴板操作。
不过我说的前提不是的别的程序中选择了文本,而是必须选择文本并对其进行复制。
首先可考虑使用简单一点的方法:即通过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
 
也可以监视剪切板,一有变化,检查格式是否符合要求,
符合就把它粘过来。
 
第二种方法即是自定义剪贴板操作:
不过这种方法并不适用这位朋友的例子,因这这位朋友只是要得到文本,所以用上面我说的方法就
可以了。而我这种方法则可用于复杂的数据格式的的剪贴板资料。例如我们的输入数据记录时,
可以参考这种方法。而且这种方法仿佛只用于自己的程序中或许只能用于知道这种格式的程序中。
这种方法的思路如下:
1。自定义一种格式。
2。定义一个类,在类中封装自定义格式的操作。
3。注册剪贴板格式。
4。使用自定义的剪贴板格式。
 
接受答案了.
 
顶部