捕捉clipboard(100分)

  • 主题发起人 主题发起人 poopoo
  • 开始时间 开始时间
P

poopoo

Unregistered / Unconfirmed
GUEST, unregistred user!
我要捕捉clipboard上的东西,需要窗口隐蔽,如何实现呢?
 
开个Timer,定时检查ClipBoard上的内容
 
为何不另写个线程,以捕捉clipboard上的东西.
 
我需要随时捕捉,一有就捕捉。而且需要存储随时调用。
可以写例子吗?
 
在著名的rxlib控件包RX Tools组里面有个ClipboardViewer
在它的OnChange属性中编程就可以了,特好使!
 
Win32API有关于剪贴板钩子的函数,只要
安装了剪贴板的钩子函数,就可以实时监
视剪贴板了,任何剪贴板的改变都会触发
一条消息.当然当前程序必须要有机会获
得CPU才能处理这个消息.
例如,用WORD的宏编一个循环粘贴内容到
剪贴板的函数,当函数执行时,由于WORD
并没有释放CPU,监视剪贴板的程序并不能
处理消息,只有当宏执行完了之后,别的程序
才能获得处理机会,但此时,剪贴板只剩下
最后一次粘贴的内容了.
 
我现在是用TIMER, 但要实时捕捉可能不太做得到. 而用钩子函数虽然实时性

好一点. 但一旦你的程序出了问题, 系统也会.... rxLib要实现不知能否解

决. 有经验的大侠请介绍一下.
 
我用word的宏实现死循环,用ClipboardViewer没有问题!
 
有得必有失,很正常的事情.
用Timer太占用资源,很不合算的.
 
最简单的就是自定义消息,通过它来接收,
 
同意方大侠的意见,使用RxLib,如果你愿意,还可看它是如何实现
对剪切板的监视的,又能直接用,又能学,何乐而不为。
下载的地方很多,你可去它的老家:<a href="http://rx.demo.ru">下载RxLib。</a>
 
利用消息,不需要自定义.回应和消息我忘了,要不下一回我再补上!
 
同意D4,当剪贴版变化是它会向所有的应用程序发出一条消息,你只需处理一下
该消息就行了!!具体如下:

procedure ClipboardChanged(var message: TMessage); message WM_DRAWCLIPBOARD;

procedure TForm1.ClipboardChanged(var message: TMessage);
begin
MessageBox(0,'Clipboard changed once again...','info',0);
end;
 
对不起一开始还需要调用一下函数:

SetClipboardViewer(form1.handle)
 
1、我觉得不要用什么控件,自己解决可以学不少东西嘛!
再说RX的程序写得那么臭!

2、使用WM_DrawClipboard消息可以搞定
但存在问题:
Win32文档中说明如下:
The WM_DRAWCLIPBOARD message is sent to the first window in the
clipboard viewer chain when the content of the clipboard changes.
This enables a clipboard viewer window to display the new content of
the clipboard.
即消息只直接发给clipboard viewer链中的第一个程序,其他程序不会直接收到消息
后面又有说明如下:
Only clipboard viewer windows receive this message. These are windows
that have been added to the clipboard viewer chain by using the
SetClipboardViewer function.
Each window that receives the WM_DRAWCLIPBOARD message must call the
SendMessage function to pass the message on to the next window in the
clipboard viewer chain. The handle of the next window in the chain is
returned by SetClipboardViewer, and may change in response to a
WM_CHANGECBCHAIN message.
即:
(1)使用SetClipboardViewer函数将本程序设置为Clipboard Viewer
(2)Clipboard Viewer链中下一个程序的Handle由上述函数返回
(3)本程序在处理完WM_DrawClipboard消息后必须将WM_DrawClipboard消息发送给
下一个程序,否则链中所有后续程序都不会收到消息。己所不欲。。。。
没什么技术问题了,程序就不写了
 
写个剪贴板处理程序。
<A HREF = "http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=99245">
 
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=99245
 
回答了这么多,问题就结束掉了吧,可惜poopoo没有来。。。
 
后退
顶部