粘贴功能的问题 (100分)

  • 主题发起人 主题发起人 浩毛
  • 开始时间 开始时间

浩毛

Unregistered / Unconfirmed
GUEST, unregistred user!
粘贴功能的问题:
我在一个程序里做了个全局热键
想用它实现粘贴(CTRL+C)的功能,但是不能只粘贴那个程序窗口里的东西,能粘贴其他窗口的。
请问怎么实现啊。。。。?
比如说:你做了个程序AAA,程序里设置了一个全局快捷键,
把AAA最小化,在IE里,按你在AAA设置的那个全局快捷键,执行粘贴并对粘贴的内容进行处理。

我现在只能实现先用粘贴键(CTRL+C)后,按我程序里设置的全局快捷键对粘贴的内容进
行处理,希望能将两步合起来。

//以下已经有人解答了,谢谢你们
在程序里LABAL实现点击访问网站的问题
就是窗体里LABEL实现超联接的问题。shellexecute?
具体应该怎么做?
 

shellexecute(handle,'open','http://....',nil,nil,sw_normal);
 
向指定控件或活动控件发送 WM_PASTE 消息

可以自己封装一个 Label ,实现热链接的效果
 
unit CustomLabel1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,Shellapi;

type
THyperLink = class(TCustomLabel)
private
FURL: string; // 存贮连接地址或文件名
FOwnerHandle: HWND;
protected
procedure DoOnClick(Sender: TObject);
// 处理用户单击鼠标时间
public
constructor Create(AOwner: TComponent); override; //构造函数
Function Browse(AURL: string): Integer;
published //Object Inspector中的属性值
property Caption; //标题
property Color; //字体颜色
property Cursor default crHandPoint; //指定缺省鼠标状态
property Enabled; //使能开关
property Font stored True; //.DFM中保存此属性
property Hint; //提示信息
property ShowHint default True; //缺省显示提示
property URL: string read FURL write FURL; //此属性可读写FURL以进行交互
property Visible; //是否可见
property OnClick; //鼠标单击时间
end;

procedure Register;

implementation

constructor THyperLink.Create(AOwner: TComponent);
begin
inherited Create(aOwner); //继承 aOwner的创建函数
FOwnerHandle := (Owner as TForm).Handle;
OnClick := DoOnClick; //指定OnClick时间的处理函数
Cursor := crHandPoint;
ShowHint := True; //显示提示
Font.Color := clBlue; //Caption字体为蓝色
Font.Style := [fsUnderline]; //Caption字体带下划线
Font.Size := 10; //Caption字体大小为10
end;

procedure THyperLink.DoOnClick(Sender: TObject);
begin //处理OnClick函数
if (not (csDesigning in ComponentState) and (FURL<>'')) then
begin
Browse(FURL);
// 调用相应程序打开URL中的连接地址或文件
Font.Color := clPurple;
end;
end;

Function THyperLink.Browse(AURL: string): Integer;
var
RtnValue: Integer;
begin
RtnValue := ShellExecute(FOwnerHandle, 'Open', PChar(AURL),
//调用API函数ShellExecute打开链接或文件
nil, nil, SW_SHOWNORMAL);
case RtnValue of // 错误处理
0: ShowMessage('The operating system is out of memory or resources.');
ERROR_BAD_FORMAT:ShowMessage( 'The .EXE file is invalid Win32 .EXE or error in .EXE image');
//可执行文件为非法Win32程序或其中的图象有错误
SE_ERR_ACCESSDENIED: ShowMessage( 'The operating system denied access to the specified file.');
//系统拒绝对指定文件的访问
SE_ERR_ASSOCINCOMPLETE: ShowMessage( 'The filename association is incomplete or invalid.');
//文件扩展名不完整或非法
SE_ERR_DDEBUSY: ShowMessage( 'The DDE transaction could not be completed because other DDE transactions were being processed.');
//DDE事务无法完成,因为有别的事务正在处理
SE_ERR_DDEFAIL: ShowMessage( 'The DDE transaction failed.');
//DDE事务处理失败
SE_ERR_DDETIMEOUT: ShowMessage( 'The DDE transaction could not be completed because the request timed out.');
////DDE事务无法完成,因为请求超时
SE_ERR_DLLNOTFOUND: ShowMessage( 'The specified dynamic-link library was not found.');
//指定动态连接库找不到
SE_ERR_FNF: ShowMessage( 'The specified file was not found.');
//指定文件没有找到
SE_ERR_NOASSOC: ShowMessage( 'There is no application associated with the given filename extension.');
//指定扩展名的文件没有相应的程序来关联
SE_ERR_OOM: ShowMessage( 'There was not enough memory to complete the operation.');
//内存不足,无法完成操作
SE_ERR_PNF: ShowMessage( 'The specified path was not found.');
//指定路径找不到
SE_ERR_SHARE: ShowMessage( 'A sharing violation occurred.');
//共享冲突
else
if(RtnValue <=32) then ShowMessage( 'Unknown Error in ShellExecte.');
//ShellExecte出现未知错误
end;
Result := RtnValue;
end;

procedure Register;
begin
RegisterComponents('Tools', [THyperLink]); //注册组件到Tools面板
end;
end.
 
shellExecute(0,nil,pchar('http://'+Label4.Caption),nil,nil,SW_NORMAL);
 
粘贴功能的问题:
我在一个程序里做了个全局热键
想用它实现粘贴(CTRL+C)的功能,但是不能只粘贴那个程序窗口里的东西,能粘贴其他窗口的。
请问怎么实现啊。。。。?

这个呢???拜托!!
 
不太懂你的意思
你把内容拷贝导剪切板上的话,在哪个窗口都应该可以啊
 
恩,不是这个意思,比如说:你做了个程序AAA,程序里设置了一个全局快捷键,
把AAA最小化,在IE里,按你在AAA设置的那个全局快捷键,执行粘贴并对粘贴的内容进行处理。

我现在只能实现先用粘贴键(CTRL+C)后,按我程序里设置的全局快捷键对粘贴的内容进
行处理,希望能将两步合起来。
 
其实你的问题没有描述清楚,你想实现的功能是通过
一个全局快捷键,来“复制其它程序中选中的内容并粘贴过来”。

这样的功能,可以通过监视剪切板的内容来实现。就不需要
全局快捷键了。只要剪切板中的内容有变化并且合适,就进行处理。
在其它程序中的只管复制就行了。



监视剪贴板内容
冲浪的年代,用过网络蚂蚁的人肯定不少,其中一项监视剪贴板变化的功能让人感觉到不少体贴。本文将介绍在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等函数的返回值。

 
多人接受答案了。
 
后退
顶部