Существует задача запустить в невидимом десктопе некий гуевый процесс, и исходя из некотрых событий мне нужно сделать скриншот его топ-окна. Делаю шоты через PrintWindow, софт типа calc, notepad идут нормально, однако тот же ie отрисовывает только не клиентскую часть. Вопрос: Что, где перехватить, изменить, удалить чтобы все рисовалось нормально? образец ie прилагается.
пробывал, по отдельности всех шотить, кто то нормально шотится, кто-то также черный. Ну че, не кто окна рисовать не умеет? Что мне прехватить в процессе чтобы он думал что он на видемом десктопе?
WM_PRINT не помогает? Или поиском по форуму вы принципиально не пользуетесь? http://www.wasm.ru/forum/viewtopic.php?id=31473
WM_PRINT это аналог PrintWindow. Поиском мы пользуемся очень активо, указаный вами юрл, это не мой случай, он не помогает.
Вот кусочек кода который делает скриншот рабочего стола в Bitmap он на MFC, но можешь переделать на WinAPI Код (Text): CWnd* pDesktopWnd = GetDesktopWindow(); CDC* pDesktopDC = pDesktopWnd->GetDC(); CDC memDC; CBitmap memBmp; CBitmap* pOldBitmap; int nDeskCY = GetSystemMetrics(SM_CYSCREEN); int nDeskCX = GetSystemMetrics(SM_CXSCREEN); memBmp.CreateCompatibleBitmap(pDesktopDC,nDeskCX,nDeskCY); memDC.CreateCompatibleDC(pDesktopDC); pOldBitmap = memDC.SelectObject(&memBmp); memDC.BitBlt(0,0,nDeskCX,nDeskCY,pDesktopDC,0,0,SRCCOPY); memDC.SelectObject(pOldBitmap); pDesktopWnd->ReleaseDC(pDesktopDC); в итоге в HBITMAP(memBmp) - наш скриншот
2ntcdm - это все понятно, но не работает на НЕ АКТИВНОМ десктопе. 2kero - да вижу, PrintWindow ваще уходит в sysenter сразуже. Короче я не решил проблему однако мне стало все более понятно. Все что я намутил прекрасно работает под вистой и семерокой, а именно - перебираю все окна и рисую их... Под ХР не прорисовываются только окна с CS_PARENTDC, возрашает FALSE. Что легко обьясняется описанием: A window with the CS_PARENTDC style bit receives a regular device context from the system's cache of device contexts. Все впринципе кажется решиться, если поставить перехват на RegisterClass и т.д., однако системные классы типа Edit, Static не регистрируются в процессе, и естевенно нельзя воздейстовать на них SetClassLong(GCL_STYLE). Что можно еще придумать с юзермода? Что то придумать с "system's cache of device contexts"?
в процесс отдлаке ), но осталась еше одна проблемка... как бы максимально быстро передать теперь шот из процесса кому принадлежат окна в процесс который запросил шот... CreateDIBSection... что то еще?