получение скриншота окна windows API - PullRequest
4 голосов
/ 15 марта 2010

Я пытаюсь заставить программу работать поверх существующего графического интерфейса, аннотировать ее и предоставлять дополнительные вычисления и статистическую информацию. Я хочу сделать это с помощью распознавания изображений, так как я узнал об этом довольно много в университете, используя Matlab и подобные вещи. Я могу получить дескриптор окна, для которого я хочу выполнить распознавание изображения, но я не знаю, как превратить этот дескриптор в изображение этого окна и всех его видимых дочерних окон. Я предполагаю, что ищу что-то вроде функции скриншота, но ограничено одним окном.

Как бы я поступил так? Я полагаю, мне нужно что-то вроде .bmp, чтобы возиться с. Кроме того, он должен был быть достаточно эффективным, чтобы я мог вызывать его несколько раз в секунду без остановки моего ПК.

Надеюсь, это не очевидный вопрос, я набрал некоторые вещи в Google, но ничего не связал.

Ответы [ 2 ]

5 голосов
/ 15 марта 2010

Я думаю CImage класс будет полезен.

void CreateImage(HWND hwnd)
{
    CImage img;
    img.m_hDC = ::GetWindowDC(hwnd);
    img.Save(strFileName);
}
4 голосов
/ 15 марта 2010

Одним простым способом является использование PrintWindow API (в основном это автоматизированный Alt + Print). В следующем примере показан снимок экрана калькулятора, но вам просто нужно заменить маркеры.

void CScreenShotDlg::OnPaint()
{
    // device context for painting
    CPaintDC dc(this);

    // Get the window handle of calculator application.
    HWND hWnd = ::FindWindow( 0, _T( "Calculator" ));

    // Take screenshot.
    PrintWindow( hWnd,
                 dc.GetSafeHdc(),
                 0 );
}

(см. http://weseetips.com/2008/07/14/how-to-capture-the-screenshot-of-window/)

...