0

这个问题与:which API Microsoft Word (Office 2013) is using the paint the screen 相关,没有得到回答。

我有一个与 Office 相当相关的 Office 插件(本机 C++)。使用挂钩我正在修改 Office 应用程序的客户区。

直到 Office 2010、连接 WM_NCPAINT 和在 Office Window 上使用 GDI 方法,一切对我来说都很好。

但 Office 2013 使用 Direct2D、DXGI 和 DirectWrite。在 Windows 7 上,如果我在屏幕上画了一些东西 - 它会在下次光标闪烁时被删除。在 Windows 8 上 - 我什至无法访问屏幕。

目前,我的想法是挂钩ID2D1DeviceContext::BeginDraw, ID2D1DeviceContext::EndDraw- 在最后一个函数上,就在委托给真正的函数之前,我会添加我的东西。另一个想法是钩子IDXGISwapChain1::Present1。这两种方法都有问题,我很难确定上面发生了什么。

我什至在想在我想要装饰的客户区顶部使用不同的流程(或基于 GDI 的窗口 - 如果可能的话),大部分真正的东区都是 100% 透明的。此解决方案的问题是键盘焦点和鼠标单击等问题。

任何提示或建议将不胜感激。任何工具(DirectX 的 Spy++)都会受到赞赏。DirectX(特别是 Direct2D)是否记录了可扩展或可插入的故事,我不知道并且可以使用?我缺少内核模式中的任何内容吗?

4

2 回答 2

1

这是我的建议:不要那样做。任何一个。如果你发现自己不得不如此深入地钩住和侵入主机,这清楚地表明你不应该这样做。找到另一种方式来绘制您需要的内容,或更改您的 UI 设计,使其适合 Office 已经提供的内容。即使您认为可以使其正常工作,但每次更新 Office(补丁、服务包、新版本)时,您的所有东西都将面临破坏的高风险,无法保证您能够使其正常工作再次。

于 2013-08-19T18:41:03.660 回答
1

嗯,不知道 Direct Draw 到底是如何工作的,但我在 Direct3D 的 EndScene 函数上钩住了一次,并在真正的 EndScene 可以执行之前向场景中添加了一些东西。我制作了一个小视频,显示: http ://www.youtube.com/watch?v=ZFshqIEaLBc

于 2013-08-14T07:58:31.197 回答