监视剪贴板(100分)

  • 主题发起人 主题发起人 yeah
  • 开始时间 开始时间
Y

yeah

Unregistered / Unconfirmed
GUEST, unregistred user!
我制作了一个剪贴板查看程序。我使用SetClipboardViewer(Handle)<br>注册到剪贴板查看链后,在获取到WM_DRAWCLIPBOARD消息后,程序自动<br>粘贴来自剪贴板的数据,这本来没有什么问题,但是,我想达到的目的<br>是:<br>如果我在程序本身(如一个Edit)中进行复制操作,则忽略掉<br>WM_DRAWCLIPBOARD消息,如果剪贴板的数据来自外部程序,则正常处<br>理此消息。也就是说,应该如何判断当前剪贴板的数据是来自我的程序还是<br>来自外部程序?
 
这不太可能吧。到了剪贴版上,还能不一样?关注!
 
只要在你本身程序中截获wm_copy消息就可以了.<br>procedure TMainForm.WndProc(var Message: TMessage);<br>begin<br>&nbsp; &nbsp; &nbsp;if Message.Msg=WM_COPY then<br>&nbsp; &nbsp; &nbsp; &nbsp;showmessage('u can not copy to clipboard!');<br>&nbsp; &nbsp; &nbsp;else<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Inherited WndProc(Message);<br>end;<br>
 
建铁板的数据是不是也是有owner的?
 
cytown:yeah是想把自己程序的数据跟其他来源的数据区分开,而不是<br>&nbsp; &nbsp; &nbsp; &nbsp;禁止自己程序的数据复制。
 
在你的程序中定义一个全局变量selfcopy:boolean;<br>照cytown的方法,截取wm_copy<br>处理时设置变量selfcopy:=true;<br>你处理wm_drawclipboard消息的过程每次判断是否selfcopy&lt;&gt;true if<br>then &nbsp;show it else <br>begin<br>&nbsp; not show it<br>&nbsp; selfcopy:=false;<br>end;
 
这样不好吧。你在程序中拷贝过后,selfcopy设成了true,但随后<br>在别的地方把数据拷贝到剪贴版上,又怎么改变selfcopy呢?
 
你的wm_copy发出之后,马上在wm_drawclipboard过程里改成 selfcopy=false;
 
查DNCHEN的信息,他问过
 
感谢各位的回答,这个问题我今天终于解决了。<br>只需在捕捉到WM_DrawClipBoard消息后判断<br>&nbsp; if GetForegourndWindow=Handle then Exit;就行了。<br>不知版主是否允许我收回分数呢?*_^
 
你这个方法不太好,后台的程序一样可以拷贝剪贴版的.
 
查到资料了,看来我说的没错:<br>"建铁板的数据是不是也是有owner的"<br><br>利用GetClipboardOwner函数,改函数返回拥有剪贴版的窗口的句并,若出错或<br>剪贴版不属于任何窗口,则返回0;<br><br>比如,你的程序有一个Tedit,它的handle是12345,你可以在收到WMDrawClip消息<br>后,如此判断:<br>begin<br>//将剪贴板消息发送到观察链上的下一个窗口<br>SendMessage(hwndNextClip,Message.Msg,Message.WParam ,Message.LParam );<br>if getclipboardowner=edit.handle then<br>//是从自己的edit拷贝的<br>else<br>//是从别的程序拷贝的<br>
 
接受答案了.
 
后退
顶部