Можно ли выдрать невидимые (например, перекрытые) участки отрисовываемого окна или заставить его отрисовываться (или делать полную копию) в нужный мне DC?
K>Можно.

А каким образом? Прикрутить DC к другому процессу вроде бы нельзя. Подменять HDC бессмысленно... ?
Здравствуйте, sw, Вы писали:
K>>Можно.
sw>
А каким образом? Прикрутить DC к другому процессу вроде бы нельзя. Подменять HDC бессмысленно... ?
Употребите местный Поиск, на рсдн полно было топиков на эту тему.
Там и прочитаете про:
WM_PRINT (для совсем уж невидимых окон) с неизбежной отсылкой к Фень Юаню,
PrintWindow,
WS_EX_LAYERED+SetLayeredWindowAttributes,
WS_EX_COMPOSITED,
...
Спасибо большое, всё прекрасно работает. Выдёргивает с другого desktop'а полностью со всеми СHILDами, но есть один нюанс: при установке окну WS_EX_COMPOSITED, эффект работает только после сворачивания/разворачивания его вручную. Программный вариант CloseWindow+RedrawWindow+ShowWindow+RedrawWindow не прокатывает... Такая ерунда только на другом desktop'е. На локальном всё ок.
Здравствуйте, Аноним, Вы писали:
А>Спасибо большое, всё прекрасно работает. Выдёргивает с другого desktop'а полностью со всеми СHILDами, но есть один нюанс: при установке окну WS_EX_COMPOSITED, эффект работает только после сворачивания/разворачивания его вручную. Программный вариант CloseWindow+RedrawWindow+ShowWindow+RedrawWindow не прокатывает... Такая ерунда только на другом desktop'е. На локальном всё ок.
А не покажете здесь этот ваш код — с другого desktop'а, с нюансом ?
Здравствуйте, kero, Вы писали:
K>А не покажете здесь этот ваш код — с другого desktop'а, с нюансом ?
HDESK d=CreateDesktop(dt_name,0,0,0,GENERIC_ALL,0);
...
STARTUPINFO startinfo;
startinfo.lpDesktop=dt_name;
startinfo.cb=sizeof(STARTUPINFO);
startinfo.dwFlags=0;
startinfo.lpReserved=0;
startinfo.lpReserved2=0;
startinfo.cbReserved2=0;
startinfo.lpTitle=0;
PROCESS_INFORMATION processinfo;
CreateProcess(0,proc_cmd,0,0,0,0,0,0,&startinfo,&processinfo);
...
HDC tmp=CreateCompatibleDC(0);
RECT r;::GetWindowRect(hwnd,&r);
HDC src=::GetDC(hwnd);
long style=::GetWindowLong(hwnd,GWL_EXSTYLE);
::CloseWindow(hwnd);
::RedrawWindow(hwnd,&r,0,RDW_FRAME|RDW_ERASE|RDW_INVALIDATE|RDW_ERASENOW|RDW_UPDATENOW|RDW_ALLCHILDREN);
::UpdateWindow(hwnd);
::ShowWindow(hwnd,1);
::SetWindowLong(hwnd,GWL_EXSTYLE,style|WS_EX_COMPOSITED);
::RedrawWindow(hwnd,&r,0,RDW_FRAME|RDW_ERASE|RDW_INVALIDATE|RDW_ERASENOW|RDW_UPDATENOW|RDW_ALLCHILDREN);
::UpdateWindow(hwnd);
// ::SendMessage(hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
::PrintWindow(hwnd,dst,0);
Изголялся по-всякому с вариантами перерисовки окна. Очевидно, я чего-то не понимаю... Но ведь на активном работает.
Хорошо работает выдирание каждого child-окна, но к сожалению, в нужной мне проге есть хитрые тулбары, которые пока не выдираются и поганят результат.
Здравствуйте, kero, Вы писали:
K>А что, SetWindowPos(...) — тоже не сработало?
К сожалению, нет.

Вышел по-другому. Долго и неэффективно, зато работает — перебором всех дочерних окон и выдиранием каждого через PrintWindow. Теперь формируется как надо. Спасибо за помощь.