我想知道Office剪贴板集合是否已打开。这是保存最后24个剪贴板数据的剪贴板窗格。在Office 2007和2010上,您可以通过展开主页功能区上的剪贴板区域来获取它,在Office 2003中,您可以从任务窗格区域打开它,并从菜单中选择剪贴板。
我是一个Office插件。
虽然我正在做各种API挂钩(使用IAT),但我正在寻找最简单的解决方案。
我最初的想法是找一个带标题的窗口:"收集并粘贴2.0" (使用Spy ++查看),使用各种Windows类(例如在Word中为bosa_sdm_msword)。但是,用户可以在不显示Office剪贴板的情况下查看“收集”,然后重新启动Office。此时,Office将收集没有任何符号的数据到窗口。
我正在查看注册表项:Software \ Microsoft \ Office \%d.0 \ Common \ General \ AcbOn。这很酷,但在用户退出Office之前,此条目不会保存。因此,用户可以打开不同的应用程序,打开收集,关闭窗口。
Office剪贴板在通知区域中创建一个图标。请参阅问题:how to acquire list of notification area icons?。不幸的是,这个问题没有得到答案。如果您知道答案,请在此处或在该问题上回答(您将获得+1两次!)
正如我所说,我在应用程序的过程中,我能够拦截任何具有导出符号的内容,但我希望尽量减少对应用程序的影响。例如,拦截发送消息或子类化Window将对Office应用程序的性能(在某些情况下:稳定性)产生影响。
在Office 2003中有一个窗口,其中包含一个名为(' ActiveClipboard')的类,但我无法在2007年和2010年找到它。另一方面,我看到WM_USER + 2304,其中我不知道它是什么。
有没有人经历过这条道路?任何提示?
答案 0 :(得分:0)
回答我自己的问题:
据我所知,Office在对象模型中没有任何事件或API来告诉您Office是否正在收集剪贴板。但是,这两种方法的结合对我有用:
枚举系统中的所有窗口,并搜索具有以下属性的窗口(分别为类名/标题):
Word 2010:“bosa_sdm_msword”,“收集并粘贴2.0” Word 2003:“bosa_sdm_Microsoft Office Word 11.0”,“收集并粘贴2.0” Word 2007:“bosa_sdm_Microsoft Office Word 12.0”,“收集并粘贴2.0” Excel(全部):bosa_sdm_XL9“,”收集并粘贴2.0“ PowerPoint(全部):“bosa_sdm_Mso96”,L“收集并粘贴2.0”
如果存在这样的窗口,这意味着Office正在收集剪贴板数据。
搜索注册表项:HKCR \ Software \ Microsoft \ Office \ 14.0 \ Common \ General \ AcbOn(REG_DWORD)。值1表示Office正在收集数据。