Перехват ExtTextOut (GDI API) - PullRequest
       13

Перехват ExtTextOut (GDI API)

0 голосов
/ 21 ноября 2010

Привет,

Я подключаю API ExtTextOut для извлечения текста в определенной позиции из любого окна приложения (например, текста под курсором / кареткой в ​​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. Указывается в качестве параметров ExtTextOut положения строки X, Y (относительно прямоугольника клиента окна).
  3. Восстановить прямоугольник вокруг текста из контекста устройства, используя один из предоставленных API для отсечения областей / путей, например, API GetClipBox / GetClipRgn.

    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-интерфейсов для извлечения области / пути из контекста устройства он успешно возвращается и указывает, что для этого контекста устройства нет области / пути.

Мои вопросы:

  1. Как могло случиться, что для контекста устройства не существует региона / пути?

  2. Есть ли другой способполучить положение (или прямоугольник) текста, поскольку, как я понимаю, его положение должно быть где-то указано, чтобы окончательно нарисовать его на экране?

Любая помощь будет оценена.

Спасибо,

Momico.

Ответы [ 2 ]

1 голос
/ 22 ноября 2010

Если приложение создает DC памяти и использует эти функции, вы не сможете увидеть x, y написанного текста. Затем вы увидите, как bitblt сбрасывает буфер памяти в окно DC. Это сложнее, но вы можете подключить bitblt, чтобы увидеть относительную позицию DC памяти в окне, и вы сможете вычислить позицию текста в операции bitblt.

0 голосов
/ 22 ноября 2010

Может ли проблема быть связана с программами, использующими рисование с двойной буферизацией?

, т. Е. Текст может отображаться в один или несколько временных DC, которые затем переносятся в "реальный" DC.

С этими координатами вы получите координаты, но они не всегда будут совпадать с окончательными координатами, и соответствующие HDC могут существовать только в течение короткого момента, а не те, которые видны в окне / на экране.

...