Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > получить "сномок" окна по handle'y


Автор: ano360 29.1.2009, 20:20
есть handle окна. пытаюсь получить его изображение:
(С++ Builder)
DefWindowProc(hWnd, WM_PRINT,(WPARAM)Form1->Image1->Canvas->Handle,NULL); 
на что Image1 заливается белым

   SendMessage(hWnd, WM_PRINT,(WPARAM)Form1->Image1->Canvas->Handle,NULL); 

hWnd не битый, проверено . пробую для разных окон, при любом hWnd одно и то же

может необходимо настроить буфер-приемник?

Автор: GremlinProg 29.1.2009, 23:11
Код

SendMessage(hWnd, WM_PRINT,(WPARAM)Form1->Image1->Canvas->Handle,PRF_CLIENT | PRF_NONCLIENT); 

Автор: ano360 30.1.2009, 11:53
тот же эффект....

Автор: Katko 22.3.2009, 16:11
Делаешь нужное окно активным и имитируешь нажатие Alt+PrtScr:
Код

    keybd_event(VK_SNAPSHOT, 1, 0 ,0);
    keybd_event(VK_SNAPSHOT, 1,  KEYEVENTF_KEYUP,0);


У мну срабатывает на ура.

Автор: GremlinProg 22.3.2009, 17:11
принтскрин делает то же самое, да и по крайней мере на WM_PRINT, граница окна с кэпшеном должна была бы прорисоваться,
раз все белое, значит идет какаято пост-обработка на канве, которая все это стирает
пробуй напрямую создать девайс, назначить ему битмап и послать WM_PRINT
либо на крайний случай, получить координаты окна и скопировать его с нулевого девайса (GetDC(0))

Автор: BEOWOLF 23.3.2009, 07:50
Вот собственно пример, как надо делать принтскрин под GDI:
Код

static HBITMAP CALLBACK ShootDesktop(const RECT& rect)
{
    HDC hdcScreen = CreateDC(TEXT("DISPLAY"), 0, 0, 0); // make virtual screen device context
    HDC hdcCompatible = CreateCompatibleDC(hdcScreen); // make memory device context
    HBITMAP hbmScreen = CreateCompatibleBitmap(hdcScreen, rect.Width(), rect.Height());
    hbmScreen = (HBITMAP)SelectObject(hdcCompatible, hbmScreen); // push bitmap to memory HDC
    BitBlt(hdcCompatible, 0, 0, rect.Width(), rect.Height(), hdcScreen, rect.left, rect.top, SRCCOPY);
    hbmScreen = (HBITMAP)SelectObject(hdcCompatible, hbmScreen); // rotate back bitmap
    DeleteDC(hdcCompatible);
    DeleteDC(hdcScreen);

    return hbmScreen;
}
Здесь можно и без хэндла окна обойтись, только имея его координаты в rect. Потому что hdcScreen всё равно получать придётся, либо с десктопа, либо через GetWindowDC. Далее с получиным хэндлом можно проводить разные манипуляции - либо рисовать матрицу в другие девайсы, либо построить из него Gdiplus::Bitmap, который можно сохранить в файл в нужном графическом формате. Либо сформировать поток и передать инфу по сети.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)