这个问题与:Which API Microsoft Word (Office 2013) is using the paint the screen有关,但没有得到答复。
我有一个Office插件(本机C ++),它与Office完全相关。使用钩子我正在修改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%透明的。此解决方案的问题是键盘焦点和鼠标单击等问题。
任何提示或建议将不胜感激。任何工具(Spy ++ for DirectX)都将受到赞赏。 DirectX(特别是Direct2D)是否记录了可扩展或可插入的故事,我不知道并且可以使用?内核模式中有什么东西我不见了吗?
答案 0 :(得分:1)
我不知道究竟是如何在Direct Draw上工作的,但是我曾经为Direct3D连接了EndScene函数,并在真正的EndScene执行之前向场景中添加了一些东西。 我做了一个小视频,表明: http://www.youtube.com/watch?v=ZFshqIEaLBc
答案 1 :(得分:0)
这是我的建议:不要这样做。任何一个。如果你发现自己不得不深深地钩住和攻击主机,这是一个明确的迹象,你不应该这样做。找到另一种方法来绘制您需要的内容,或者更改您的UI设计,使其适合Office已经容纳的内容。即使您认为可以实现这一点,每次更新Office(补丁,服务包,新版本)时,您将面临所有内容破坏的高风险,并且无法保证您能够使其正常运行试。