挂钩ExtTextOut(GDI API)

时间:2010-11-21 13:28:10

标签: windows hook gdi

您好,

我正在挂钩ExtTextOut API,用于从任何应用程序窗口检索特定位置的文本(例如MS Word中光标/插入符号下的文本)。 在大多数情况下,我能够从ExtTextOut函数及其位置检索文本。

BOOL ExtTextOut(
  __in  HDC hdc,
  __in  int X,
  __in  int Y,
  __in  UINT fuOptions,
  __in  const RECT *lprc,
  __in  LPCTSTR lpString,
  __in  UINT cbCount,
  __in  const INT *lpDx
);

通过以下方法之一检索文本的位置:

  1. 在剪切矩形的ExtTextOut函数中指定 参数(const RECT * lprc - 它是一个可选参数)
  2. 指定为X,Y字符串位置ExtTextOut参数(相对于窗口客户端矩形)。
  3. 使用提供的用于剪切区域/路径的API(例如GetClipBox / GetClipRgn API)从设备上下文中重新检查文本周围的矩形。

    int GetClipBox(   __in HDC hdc,   __out LPRECT lprc ); int GetClipRgn(   __in HDC hdc,   __in HRGN hrgn );

  4. http://msdn.microsoft.com/en-us/library/dd183435(v=VS.85).aspx

    问题在于,在某些应用程序中,这些用于检索文本位置的方法都不起作用。此外,更令人沮丧的是,当使用某些API从设备上下文中检索区域/路径时,它会成功返回并指示该设备上下文没有区域/路径。

    我的问题:

    1. 设备上下文没有区域/路径怎么可能?

    2. 有没有其他方法来检索文本的位置(或矩形),因为据我所知,必须在某处指定其位置才能最终在屏幕上绘制它?

    3. 任何帮助将不胜感激。

      谢谢,

      Momico。

2 个答案:

答案 0 :(得分:1)

如果应用程序创建内存DC并使用这些功能,您将无法看到所写文本的x,y。 然后,您将看到bitblt将内存缓冲区转储到窗口DC。它更复杂,但您可以挂钩bitblt以查看窗口中内存DC的相对位置,您将能够在bitblt操作中计算文本的位置。

答案 1 :(得分:0)

问题可能是因为使用双缓冲绘画的程序?

即。可以将文本呈现为一个或多个临时DC,然后将其分配到“真实”DC。

使用那些你会获得坐标但它们并不总是与最终坐标相匹配,所涉及的HDC可能只存在一小段时间而不是在窗口/屏幕上看到的那些。