Ms office 修改现有Direct2D应用程序的屏幕

Ms office 修改现有Direct2D应用程序的屏幕,ms-office,reverse-engineering,direct2d,dxgi,Ms Office,Reverse Engineering,Direct2d,Dxgi,这个问题与:,这是一个悬而未决的问题 我有一个Office插件(本机C++),它相当涉及Office。我正在使用钩子修改Office应用程序的客户端区域 在Office2010之前,一切都很顺利,挂上了WMncPaint,并在Office窗口上使用了GDI方法 但Office 2013使用Direct2D、DXGI和DirectWrite。在Windows7上,如果我在屏幕上画一些东西,下次光标闪烁时,它就会被擦除。在Windows 8上-我甚至没有访问屏幕的权限 目前,我的想法是钩住ID2D1

这个问题与:,这是一个悬而未决的问题

我有一个Office插件(本机C++),它相当涉及Office。我正在使用钩子修改Office应用程序的客户端区域

在Office2010之前,一切都很顺利,挂上了WMncPaint,并在Office窗口上使用了GDI方法

但Office 2013使用Direct2D、DXGI和DirectWrite。在Windows7上,如果我在屏幕上画一些东西,下次光标闪烁时,它就会被擦除。在Windows 8上-我甚至没有访问屏幕的权限

目前,我的想法是钩住
ID2D1DeviceContext::BeginDraw
ID2D1DeviceContext::EndDraw
——在最后一个函数中,就在委托给实际函数之前,我将添加我的内容。另一个想法是hook
IDXGISwapChain1::Present1
。这两种方法都存在问题,我很难确定上面发生了什么

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


任何提示或建议将不胜感激。任何工具(用于DirectX的Spy++)都将受到欢迎。DirectX(特别是Direct2D)是否有可扩展或可插拔的文档,我不知道也可以使用?内核模式中有什么我不知道的吗?

嗯,我不知道在Direct Draw上是如何工作的,但是我曾经钩住Direct3D的EndScene函数,在执行真正的EndScene之前向场景添加了一些东西。 我制作了一个小视频,显示:
我的建议是:不要那样做。任何一个。如果你发现自己不得不如此深入地勾引和侵入主机,这显然表明你不应该这么做。找到另一种方法来绘制您需要的内容,或者更改您的UI设计,使其与Office已经容纳的内容相适应。即使您认为这是可行的,但每次Office更新(补丁、service pack、新版本)时,您的所有东西都有很高的损坏风险,无法保证您能够再次使用它。

谢谢@defragger。你的视频很酷。在DirectDraw中,所有绘图都被包装在BeginDraw/EndDraw之间,事实上,将EndDraw与绘图挂钩是解决方案的开始。有一些问题,比如裁剪区域、协调翻译等等,但这可能是我们的方向。我理解并尊重你的观点。我自己也曾在微软工作过,那时候我也不喜欢使用未记录假设的第三方应用程序。然而,在现实中,在微软以外的世界里,人们别无选择。Office不提供任何用于提供自定义语法检查的可插拔点,也不提供用于文档模型外部装饰的可插拔点(就像IE那样)。事实上,我是在2010=>2013年之间破产的,如果我再次破产,我会处理这个案子——这是生活的一部分(p.s.I love paint.net)。好吧,可以这么说,你已经签署了弃权书。)不幸的是,我没有答案给你。