【问题标题】:Hooking ExtTextOut (GDI API)挂钩 ExtTextOut (GDI API)
【发布时间】:2011-05-13 09:21:13
【问题描述】:

嗨,

我正在使用 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( __在 HDC hdc 中, __out LPRECT lprc ); 诠释GetClipRgn( __在 HDC hdc 中, __in HRGN hrgn );

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

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

我的问题:

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

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

我们将不胜感激。

谢谢,

莫米科。

【问题讨论】:

  • 听起来你在写某种恶意软件!!!
  • 好吧,我不是。没有恶意软件,有恶意使用的软件:)

标签: windows hook gdi


【解决方案1】:

如果应用程序创建内存 DC 并使用这些函数,您将无法看到写入的文本的 x、y。 然后,您将看到一个 bitblt 将内存缓冲区转储到窗口 DC。比较复杂,但是可以hook bitblt来查看内存DC在窗口中的相对位置,就可以在bitblt操作中计算出文本的位置了。

【讨论】:

  • 谢谢彼得,你的回答很有帮助。
  • 我昨天的回答不是这么说的吗? :)
  • 嗨,Leo,你的回答同样好,只是这个回答对我来说更具体。所以我选择了这个作为接受的答案。谢谢。
【解决方案2】:

问题可能是由于使用双缓冲绘画的程序造成的吗?

即文本可能会被渲染到一个或多个临时 DC,然后将这些 DC 传送到“真正的”DC。

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

【讨论】:

  • 感谢您的回答利奥。有道理我会检查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
相关资源
最近更新 更多