我正在挂钩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
);
通过以下方法之一检索文本的位置:
使用提供的用于剪切区域/路径的API(例如GetClipBox / GetClipRgn API)从设备上下文中重新检查文本周围的矩形。
int GetClipBox( __in HDC hdc, __out LPRECT lprc ); int GetClipRgn( __in HDC hdc, __in HRGN hrgn );
(http://msdn.microsoft.com/en-us/library/dd183435(v=VS.85).aspx)
问题在于,在某些应用程序中,这些用于检索文本位置的方法都不起作用。此外,更令人沮丧的是,当使用某些API从设备上下文中检索区域/路径时,它会成功返回并指示该设备上下文没有区域/路径。
我的问题:
设备上下文没有区域/路径怎么可能?
有没有其他方法来检索文本的位置(或矩形),因为据我所知,必须在某处指定其位置才能最终在屏幕上绘制它?
任何帮助将不胜感激。
谢谢,
Momico。
答案 0 :(得分:1)
如果应用程序创建内存DC并使用这些功能,您将无法看到所写文本的x,y。 然后,您将看到bitblt将内存缓冲区转储到窗口DC。它更复杂,但您可以挂钩bitblt以查看窗口中内存DC的相对位置,您将能够在bitblt操作中计算文本的位置。
答案 1 :(得分:0)
问题可能是因为使用双缓冲绘画的程序?
即。可以将文本呈现为一个或多个临时DC,然后将其分配到“真实”DC。
使用那些你会获得坐标但它们并不总是与最终坐标相匹配,所涉及的HDC可能只存在一小段时间而不是在窗口/屏幕上看到的那些。