Как я могу извлечь текстовую информацию из нарисованного владельцем окна, учитывая HWND? - PullRequest
2 голосов
/ 23 сентября 2010

Я пишу простое автоматизированное тестовое приложение для Win32.Он запускается как отдельный процесс и обращается к целевому приложению через Windows API.Я могу читать иерархии окон, находить надписи и текстовые поля и нажимать кнопки, отправляя / публикуя сообщения и т. Д. Все в порядке.

К сожалению, многие элементы управления в целевом приложении состоят из не более чем нарисованного владельцем элемента управления / окна,(Например, мы используем меню BCG и панели управления).Найти правильную часть элемента управления для отправки «щелчка» проблематично.

Есть ли какой-либо способ, учитывая HWND, для извлечения команд рисования GDI? Я хотел бы знатькаждый фрагмент текста, отрисованный для этого элемента управления, и его координаты.

Если это не удастся, есть ли способ захватить один элемент управления / окно (опять-таки HWND) в растровое изображение? Хужесценарий, я мог бы это OCR это.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

Вы можете использовать TextGRAB SDK , чтобы сделать это. К сожалению, это условно-бесплатное ПО и стоит $ 30.

1 голос
/ 24 сентября 2010

Чтобы захватить окно как растровое изображение:

RECT rc;
GetClientRect(hWnd, &rc);
int cx = rc.right-rc.left;
int cy = rc.bottom-rc.top;

HDC winDC = ::GetDC(hWnd);
HDC tempDC = ::CreateCompatibleDC(winDC);
HBITMAP newBMP = ::CreateCompatibleBitmap(winDC, cx, cy);

HBITMAP oldBmp = (HBITMAP)::SelectObject(tempDC, newBMP);
BitBlt(tempDC,0,0,cx,cy, winDC,0,0,SRCCOPY|CAPTUREBLT);
// now you have the window content in the newBMP bitmap, do with it as you please here

::SelectObject(tempDC, oldBmp);
::DeleteObject(newBMP);
::DeleteDC(tempDC);
::ReleaseDC(hWnd, winDC);
...