为什么IE关闭时会发送WM_DRAWCLIPBOARD的消息?(300分)

  • 主题发起人 主题发起人 DreamTiger
  • 开始时间 开始时间
D

DreamTiger

Unregistered / Unconfirmed
GUEST, unregistred user!
做了一个剪贴版监视的软件,发现打开IE后,进行拷贝,
监视软件会接收到WM_DRAWCLIPBOARD消息,
然后直接关闭该IE窗口,监视软件会再次接收到WM_DRAWCLIPBOARD
的消息。我的问题是,怎么区别这个消息是正常消息还是
IE关闭时候的消息。

先出300分,如果不够可以再加。
 
要区分是很难很难,因为如果IE在关闭时,如果剪贴板中还是其开始copy数据,IE会从新
设置clipboard中的数据,支部过是少了一个格式而已。应为是IE确实从新设置clipboard
中的数据,所以不能简单这个消息是正常消息还是IE关闭时候的消息.

其实这是因为IE在拷贝是使用了Ole Clipboard.他在推出时会晴空Clipboard,从新以普通
Clipboard设置数据. 其实,不光IE,其他任何使用Ole Clipboard的程序,都会产生这中
现象. 不信你试试Word.
 
难道每次要监视IE,WORD有没有在打开?
 
简单方法,弄个键盘钩子,监视Ctrl+C,Ctrl+V。
 
我发现当IE关闭后,发送的DrawClipBoard消息,用getclipboardowner
得到的handle为0。但是当word的子窗口关闭时,handle不为0。现在,
我只能先用这种方法进行区分:问题当然还有,就是无法连续粘贴来
自同一个窗口的相同文本。不知道还有没有更好的方法。

另外,我想问一下,什么时候getclipboardowner得到的handle为0?
是不是只有窗口关闭了?比如ie关闭后。

var
hwndLastClipOwner:HWND;
sLastClipText:String;

procedure TfrmMain.WMDrawClipBoard(var AMessage: TMessage);
var
hwndNewClipOwner:HWND;
begin
//将WM_DRAWCLIPBOARD消息传递到下一个观察链中的窗口
SendMessage(hwndNextClipViewer,AMessage.Msg,AMessage.WParam,AMessage.LParam);

//查询剪贴板中特定格式的数据内容
if Clipboard.HasFormat(CF_TEXT) then
begin
hwndNewClipOwner := getclipboardowner;

if ((hwndNewClipOwner = 0) or (hwndLastClipOwner = hwndNewClipOwner)) and
(sLastClipText = Clipboard.AsText) then
exit;

hwndLastClipOwner := hwndNewClipOwner;
sLastClipText := Clipboard.AsText;

//处理剪贴板中内容
PasteToEditor;
end;
end;
 
如果返回值为0, 你用ShowMessage(SysErrorMessage(GetLastError))看就知道聊

WM_DRAWCLIPBOARD消息中的WParam就为拷贝窗口的Handle. IE拷贝时,使用的是一个隐含
的窗口,ClassName为CLIPBRDWNDCLASS.如果你开始设置SetClipboardViewer时,Clipboard
Data Owner已经关闭,getclipboardowner返回就为0.如果你已经SetClipboardViewer,你再
关闭IE,此时getclipboardowner返回就不再为0. 所以你不能以此来判断是IE关闭时发送的
WM_DRAWCLIPBOARD,其实,IE关闭时,WParam不为0,也就是说,getclipboardowner返回不为0.

我还是认为:要区分是很难很难!!!
可以这样证明我的观点: 要判断是IE关闭还是正常copy,也就是说我门程序必须能够得到
一个标志位表示是IE关闭还是正常copy,但是IE关闭与copy时WM_DRAWCLIPBOARD出现是基于
相同的过程(重新设置Clipboard上的数据),也就是说两者完全一样,两者唯一的区别是
IE关闭与正常copy,而要区别这两者,你就必须截获IE的所有消息序列,从中分析出究竟
是IE关闭与正常copy引发了WM_DRAWCLIPBOARD.
假设你已经解决了IE,但是还有其他使用Ole Clipboard的程序呢,当然可以Hook WinAPI
OleSetClipboard等函数,但是你还是要区别程序是否是退出还是在运行中调用这些函数.


说了这么多,其实都是废话,In one word, 很难! :)
 
接受答案了.
 
后退
顶部