我想知道Office剪贴板集合是否已打开。这是保存最后24个剪贴板数据的剪贴板窗格。在Office 2007和2010中,你可以在Home功能区中展开剪贴板区域,在Office 2003中,你可以在任务窗格区域打开它,然后在菜单中选择剪贴板。
我有一个Office插件
虽然我正在做各种API挂钩(使用IAT),我正在寻找最简单的解决方案。
-
我最初的想法是寻找一个标题为:"收集和粘贴2.0"的窗口(检查自己与spy++),与各种Windows类(例如在Word中它是bosa_sdm_msword)。但是,用户可以勾选"收集时不显示Office剪贴板",并重新启动Office。此时,Office将收集数据而不向窗口发送任何信号。
-
我正在查找注册表项:SoftwareMicrosoftOffice%d.0CommonGeneralAcbOn。这很酷,但是直到用户退出Office才保存此条目。因此,用户可以打开不同的应用程序,打开收集,关闭窗口。
-
Office剪贴板在通知区域创建一个图标。参见问题:如何获取通知区域图标列表?不幸的是,这个问题没有答案。如果你知道这个问题的答案,请在这里或在那个问题上回复(你会得到两次+1 !)
正如我所说的,我在应用程序的进程中,我能够拦截任何具有导出符号的内容,但我想尽量减少对应用程序的影响。例如,拦截发送消息,或子类化窗口将对Office应用程序的性能(在某些情况下:稳定性)产生影响。
在Office 2003有一个窗口与类命名('ActiveClipboard'),但我找不到它在2007年和2010年。另一方面,我看到WM_USER+2304,我不知道它是什么。
有人走过这条路吗?有提示吗?
回答我自己的问题:
据我所知,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"ppt (all): "bosa_sdm_Mso96", L"Collect and Paste 2.0"
如果存在这样的窗口,说明Office正在收集剪贴板数据
-
搜索注册表项:HKCRSoftwareMicrosoftOffice14.0CommonGeneralAcbOn (REG_DWORD)。
如果值为1,说明Office正在收集数据。