0

我想知道 Office 剪贴板集合是否已打开。这是保存最后 24 个剪贴板数据的剪贴板窗格。在 Office 2007 和 2010 上,您可以通过展开主页功能区上的剪贴板区域来获得它,而在 Office 2003 中,您可以从任务窗格区域打开它,然后从菜单中选择剪贴板。

我有一个 Office 插件。

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

  1. 我最初的想法是寻找一个标题为“收集并粘贴 2.0”的窗口(使用 Spy++ 自行检查),并带有各种 Windows 类(例如,在 Word 中它是 bosa_sdm_msword)。但是,用户可以选中“收集而不显示 Office 剪贴板”,然后重新启动 Office。此时,Office 将在没有任何迹象的情况下收集数据到 Window。

  2. 我正在查看注册表项:Software\Microsoft\Office\%d.0\Common\General\AcbOn。这很酷,但是在用户退出 Office 之前不会保存此条目。因此,用户可以打开不同的应用程序,打开收藏,关闭窗口。

  3. Office 剪贴板在通知区域中创建一个图标。查看问题:如何获取通知区域图标列表?. 不幸的是,这个问题没有得到有效的答案。如果您知道此问题的答案,请在此处或在该问题上回复(您将获得两次 +1!)

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

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

有没有人走过那条路?有什么提示吗?

4

1 回答 1

0

回答我自己的问题:

据我所知,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" PowerPoint (all): "bosa_sdm_Mso96", L"收集和粘贴 2.0"

    如果存在此类窗口,则表示 Office 正在收集剪贴板数据。

  2. 搜索注册表项:HKCR\Software\Microsoft\Office\14.0\Common\General\AcbOn (REG_DWORD)。值 1 表明 Office 正在收集数据。

于 2013-01-09T09:41:20.380 回答