<font color=red>如何得知用户点了鼠标右键菜单的“复制”选项?</font>(50分)

  • 主题发起人 主题发起人 cat.yy
  • 开始时间 开始时间
C

cat.yy

Unregistered / Unconfirmed
GUEST, unregistred user!
如何得知用户点了鼠标右键菜单的“复制”选项?
 
Cat:<br>&nbsp; 你是指再我的电脑Explorer中点击鼠标右键,再选择“复制”?<br>如果是,你可给用钩子函数。我用SPY监视了一下,好像是WM_USER+7 ?
 
Reboot:<br>&nbsp; 差不多吧,总之是一切可能要用到剪贴版传递数据的那个“复制”(他的消息?)<br>&gt;&gt;用钩子函数<br>&nbsp; 哪个呢?<br>
 
cat:<br>&nbsp; 我明白你的意思了,你是要监控SetClipboradData吧?<br>在一个编辑框中,选中一部分字符,按Ctrl+C,编辑框收到<br>WM_COPY消息,右键点复制也收到WM_COPY. 如果是这样,你<br>可用SetWindowsHookEx来监控WM_COPY消息。不知是否有用:)
 
谢谢Reboot, 我看看...
 
HELP! HELP!
 
看DElphi自己的范例.Demo/actives/shellext<br>快给分
 
在一个编辑框中,选中一部分字符,按Ctrl+C,编辑框收到<br>WM_COPY消息,右键点复制也收到WM_COPY. 如果是这样,你<br>可以自定义一个消息函数,这个函数可以监视和响应整个应用<br>中所有窗口的消息事件,这样你只要判断以上两个消息事件的<br>发生就可以了!
 
给你一个例子,不要忘记给分,什么东西都可以的<br>unit Unit1;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Classes,<br>&nbsp;Graphics, Controls, Forms, Dialogs,<br>&nbsp; Clipbrd;<br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; procedure FormCreate(Sender: TObject);<br>procedure FormClose(Sender: TObject;<br>&nbsp;var Action: TCloseAction);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; NextClipHwnd:HWND<br>procedure WMDrawClipBoard(var AMessage:TMessage);message WM_DRAWCLIPBOARD;//这一个你应该明白吧<br><br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br><br>{$R *.DFM}<br><br>{ TForm1 }<br><br>procedure TForm1.WMDrawClipBoard(var AMessage: TMessage);<br>begin<br>SendMessage(NextClipHwnd,AMessage.Msg,AMessage.WParam,AMessage.LParam);<br>&nbsp; <br>&nbsp; if (Clipboard.HasFormat(CF_TEXT) or<br>&nbsp;Clipboard.HasFormat(CF_OEMTEXT)) then<br>&nbsp; begin<br>&nbsp; &nbsp; <br>&nbsp; &nbsp; Caption:=Clipboard.asText;<br>&nbsp; end;<br>end;<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br>&nbsp; <br>&nbsp; NextClipHwnd:=SetClipBoardViewer(Handle);<br>end;<br><br>procedure TForm1.FormClose<br>(Sender: TObject; var Action: TCloseAction);<br>begin<br>&nbsp; ChangeClipboardChain(Handle,NextClipHwnd);<br>&nbsp; SendMessage(NextClipHwnd,WM_CHANGECBCHAIN,Handle,NextClipHwnd);<br>end;<br><br>end.<br><br>
 
挺好,谢谢goldstone<br><br>不过我想知道监视系统中所有进程的 鼠标右键菜单的“复制”选项<br>如果不用HOOK 有无其他好办法?
 
不会吧,这就是检测clipbord的,对所有的都可以?不过我现在也想做一个,具体是鼠标一选择就将选中的内容送到<br>clipbord,我用winsight查看,消息不一样,头都大了,不知道谁有更好的办法,是否是在wm_paint时就取出来!<br>cat.yy用你的问题提自己的问题,不好意思了!
 
不用不好意思了! goldstone<br><br>我这样认为:<br>&nbsp; &nbsp; 一个EXE被加载,操作系统将为他开辟一定的活动空间,如果没用别的处理方法<br>没有办法访问其他进程的活动空间,所以goldstone的方法监视的应该是本进程的<br>剪贴板链(也许剪贴板不一样吧). &nbsp;也许把句柄改成其他进程的可能行 &nbsp;回去实验一下吧<br><br>----------------------<br>我把自己的意图说清楚一些:<br>&nbsp; &nbsp; 在用户把要复制的数据发送到剪贴板之前 获得他点了鼠标右键菜单的“复制”选项
 
哈哈,这样要用鼠标钩子的,你是想改变系统消息发送,挺难的,你可以向马飞涛要他的worm程序,我也想知道<br>程序!不过他可能不会给你的!
 
我觉得应该是一种监控程序。不管何时何地,只要在windows中点击了复制,则应马上<br>拦截该信息。
 
后退
顶部