如何知道Office剪贴板收集是否已打开?



我想知道Office剪贴板集合是否已打开。这是保存最后24个剪贴板数据的剪贴板窗格。在Office 2007和2010中,你可以在Home功能区中展开剪贴板区域,在Office 2003中,你可以在任务窗格区域打开它,然后在菜单中选择剪贴板。

我有一个Office插件

虽然我正在做各种API挂钩(使用IAT),我正在寻找最简单的解决方案。

  1. 我最初的想法是寻找一个标题为:"收集和粘贴2.0"的窗口(检查自己与spy++),与各种Windows类(例如在Word中它是bosa_sdm_msword)。但是,用户可以勾选"收集时不显示Office剪贴板",并重新启动Office。此时,Office将收集数据而不向窗口发送任何信号。

  2. 我正在查找注册表项:SoftwareMicrosoftOffice%d.0CommonGeneralAcbOn。这很酷,但是直到用户退出Office才保存此条目。因此,用户可以打开不同的应用程序,打开收集,关闭窗口。

  3. Office剪贴板在通知区域创建一个图标。参见问题:如何获取通知区域图标列表?不幸的是,这个问题没有答案。如果你知道这个问题的答案,请在这里或在那个问题上回复(你会得到两次+1 !)

正如我所说的,我在应用程序的进程中,我能够拦截任何具有导出符号的内容,但我想尽量减少对应用程序的影响。例如,拦截发送消息,或子类化窗口将对Office应用程序的性能(在某些情况下:稳定性)产生影响。

在Office 2003有一个窗口与类命名('ActiveClipboard'),但我找不到它在2007年和2010年。另一方面,我看到WM_USER+2304,我不知道它是什么。

有人走过这条路吗?有提示吗?

回答我自己的问题:

据我所知,Office在对象模型中没有任何事件或API来告诉你Office是否正在收集剪贴板。然而,这两种方法的结合对我来说是有效的:

  1. 枚举系统中的所有窗口,并搜索具有以下属性(分别为类名/标题)的窗口:

    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正在收集剪贴板数据

  2. 搜索注册表项:HKCRSoftwareMicrosoftOffice14.0CommonGeneralAcbOn (REG_DWORD)。

  3. 如果值为1,说明Office正在收集数据。

相关内容

  • 没有找到相关文章

最新更新