抛砖引玉 GetClipboardOwner的用法 (1分)

  • 主题发起人 主题发起人 kthy
  • 开始时间 开始时间
K

kthy

Unregistered / Unconfirmed
GUEST, unregistred user!
查询DFW历史帖子,大家一致认为GetClipboardOwner返回的是触发更新剪贴板的对象
的句柄,比如从TEdit中复制后,返回TEdit的句柄。查询帮助文件和MSDN,也是如是解释。
果真如此吗?不一定!不过,大多数简单情况下如此。不信,可以试试!
自行制作一个MDIFrame,一个MDIChild,后者包含一个TRxRichEdit和一个按钮。按
钮的OnClick事件中写上:
MessageBox(Handle, PChar(IntToStr(GetClipboardOwner)), 'Test', MB_OK);
运行后打开两个MDIChild的实例。试着从两个实例的TRxRichEdit中Copy一些内容,
再点击按钮。看看结果是不是一样!
经过跟踪,发现GetClipboardOwner返回的结果与WM_DRAWCLIPBOARD消息的WParam完
全一样。而MSDN中WM_DRAWCLIPBOARD的解释却说“This message has no parameters. ”
完全是自相矛盾。显然,M$的比尔该死在这里卖了个关子。

毛主席说:“自己动手,丰衣足食”。
用WinSight32跟踪,发现上面例子中,GetClipboardOwner返回的数值与另一个窗口
对象句柄一致。该对象是一个popup类型的隐藏窗口,窗口类名为“CLIPBRDWNDCLASS
0x########”,应用程序名是我们自己的程序,而HInstance却是OLE32。显然与OLE有关。
再查相关资料,原来Windows的ClipBoard是走了两条线,一条是一般的线路,另一条是
走的OLE的线路。而TRxRichEdit走的正是后者。

问题来了,对于后者,如何获得与GetClipboardOwner类似的返回值,即如何取得
某特定程序所属的CLIPBRDWNDCLASS这个隐含窗口的句柄?

只有解决了这个问题,才能判断剪贴板中的内容是有自己放进去的,还是别的应用
程序放进去的。
 
憋了大半夜,终于找到解决办法乐,共享一下。
要判断剪贴板中的内容是有自己放进去的,还是别的应用程序放进去的,只要获取相关
的ProcessId。
if GetWindowThreadProcessId(Form1.Handle, nil) = GetWindowThreadProcessId(GetClipboardOwner, nil) then
//是从当前应用更改了剪贴板内容
else
//别的应用更改了剪贴板

 
收藏,谢了!
 
后退
顶部