有啥办法可以为windows下的进程挂钩整个绘图功能?
Posted
技术标签:
【中文标题】有啥办法可以为windows下的进程挂钩整个绘图功能?【英文标题】:Is there any way to hook whole drawing functions for a process under windows?有什么办法可以为windows下的进程挂钩整个绘图功能? 【发布时间】:2011-10-10 00:10:43 【问题描述】:我想捕捉窗口显示的所有内容。另一方面,如果该窗口实际上没有在屏幕上显示任何内容,那就太好了。如何?该过程将调用绘图函数,我的函数将挂钩并将其绘制到其他地方(例如到位图文件中)并返回而不实际在屏幕上绘图。
我所知道的是,在 Windows NT 体系结构中,每个线程都有一个系统调用表,您可以将单个线程的系统调用表(或只是在开始时设置)更改为您的函数。通过仅更改绘图 api(GDI?)(我不确定如果应用程序使用 directx 渲染,我将如何生存,但也许有办法)我觉得我可以做到。我可以吗?如果应用程序使用 DirectX 渲染,我该怎么办?
提前致谢,
阿里·维利
【问题讨论】:
这是指您编写的应用程序中的窗口,还是“任何现有应用程序”中的窗口?在第一种情况下,您根本不需要钩子。在第二种情况下,至少可以说是一项艰巨的任务。 在这种情况下,最不具有侵入性和冒犯性的做法是编写自己的 gdi32 包装 DLL,该 DLL 导出与原始函数相同的函数并可选择转发函数(类似于工具GL拦截工作)。然后,您可以在自己的 DC 中重复任何绘制命令。或者,您可以尝试注入在另一个应用程序中创建自己的 DC 并用这个替换正常的 DC 的代码,然后再读取进程内存,但是嗯……祝你好运。篡改系统调用表......再次,祝你好运。 【参考方案1】:我最终只挂钩了类似 CreateDC 的函数,使其始终创建内存设备上下文并让所有其他函数利用该内存 DC。
【讨论】:
以上是关于有啥办法可以为windows下的进程挂钩整个绘图功能?的主要内容,如果未能解决你的问题,请参考以下文章
有啥办法能加快Android Studio中Gradle build速度
有啥办法能加快Android Studio中Gradle build速度