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这个隐含窗口的句柄?
只有解决了这个问题,才能判断剪贴板中的内容是有自己放进去的,还是别的应用
程序放进去的。
的句柄,比如从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这个隐含窗口的句柄?
只有解决了这个问题,才能判断剪贴板中的内容是有自己放进去的,还是别的应用
程序放进去的。