2012-08-07 92 views
0

我正在创建一个应用程序,可以从任何窗口上的选定矩形获取文本。所以我通过钩住ExtTextOut(A/W),TextOut(A/W),DrawText(A/W)apis来做到这一点。 我能够从窗口中检索文本,但在某些特殊情况下,我无法正确获取文本。 当我试图调试它时,我看到ExtTextOutW的HDC参数不能用于获取HWND,因为当我尝试调用WindowFromDC(hdc)时,它返回NULL HWND。挂钩ExtTextOutW没有给出正确的信息文本

我试图找出原因,然后我发现这个HDC是memoryDC,所以有什么办法从该内存DC获取HWND。

所以请有人帮我从HDC得到实际的HWND。

回答

0

我认为你将不得不遵循HDC因为它很可能,这将是BitBlt(),或类似的,到与实际HWND相关的HDC

  • 缓存中的文字写入内存HDC小号
  • BitBlt(),和其他人,并检查源的BitBlt()HDC是记忆的一个HDC s表示已经有文字写入它。如果是,检查目标HDCHWND如果没有的话它是一个存储HDC必须再次遵循
+0

首先,非常感谢您的回复。 其实我已经试过BitBlt,但它也不符合我的要求。我不知道为什么,但被钩住的BitBlt只被调用一次(对于主窗口)。 我想我或者做错了什么或者还有其他一些问题。我在想,应该调用每个子窗口的BitBlt,但事实并非如此。 请建议。 – vab711 2012-08-07 09:43:39

+0

有像'StretchBlt()'这样的'BitBlt()'的变种。你如何修补导入地址表?如果一个新的DLL被加载会怎么样?你发现并修补它吗? (通过_patch_我的意思是_hook_)。 'BitBlt()'本身是不够的,因为文本已经被写入。但结合文本输出功能,它可能会提供您的答案。作为测试,建议将参数打印到文本输出函数和“BitBlt()”和朋友的日志文件(或某处),并查看“HDC”是否匹配。 – hmjd 2012-08-07 09:48:22

+0

感谢您的朋友提出您的建议。 我尝试了一些BitBlt的变体,如:StretchBlt,StretchDIBits,并插入与日志相关的代码,但是没有任何内容会打印在我的日志文件中。这意味着没有任何挂钩函数(StretchBlt或StretchDIBits)被调用。 其实我是新来的,所以可能是我做错了什么。 – vab711 2012-08-07 10:47:19