У меня возникла такая проблема - необходимо получить скрин с окна приложения запущенного на другом рабочем столе в винде либо переместить его на основной рабочий стол. В нэте искал, но те примеры, которые были не сработали, в основном они касаются SetProcessWindowStation. Если кто-то знает хороший ресурс, где объясняется что к чему, то скиньте пожалуйста ссылку. Код создания рабочего стола и процесса в нём: Code: PROCESS_INFORMATION pi; bool RunProc() { bool bResult = false; int x = GetSystemMetrics( SM_CXSCREEN ); int y = GetSystemMetrics( SM_CYSCREEN ); STARTUPINFO si; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; si.lpDesktop = "MYDesktop"; ZeroMemory( &pi, sizeof(pi) ); if( CreateProcessA(0, , 0, 0, 0, 0, 0, 0, &si, &pi ) ) { bResult = true; } return bResult; } void Thread_desktop() { hDesktop = CreateDesktop("MyDesktop", NULL, NULL, 0, GENERIC_ALL, NULL); hDesktop_old = GetThreadDesktop(GetCurrentThreadId()); SetThreadDesktop(hDesktop); RunProc(); } void CControlsDlg::OnBnClickedOk() { HANDLE thr = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)Thread_desktop,NULL,0,NULL); } Новый рабочий стол и процесс в нём создаются без проблем. Они возникают при попытке снять скринов с окон на другом рабочем столе и переносе их на текущий. BitBlt копирует видимую область которая соответствует расположению нужного окна, но с текущего рабочего стола, а PrintWindow заполняет только хэдер окна, вся клиентская область получается чёрная. Подскажите пожалуйста, как взять скрин с такого окна или, как его перенести на текущий рабочий стол. PS: Поздравляю всех с наступившим Новым Годом!))) Желаю великих свершений и достижения новых творческих высот!))
Как вариант выбрать нужный десктоп для нужного потока, затем через GetDesktopWindow получить хендл десктопа, для него получить HDC, с которого потом и скопировать всё
Спасибо за ответ. Так сработало с блокнотом. IE например приходится вытягивать поэлементно. Т.к. если просто найти окно с классом IEFrame и получить с него скрин, то получается хедер окна с рамкой и чёрной клиенткой областью. А вот рекурсивный обход всех видимых контролов дал результат. Но это обычное виндовое окно, с ним удалось справится. А вот с java не получается. Само окно нахожу по классу SunAwtFrame, а стандартных дочерних элементов в нём нет и HWND res_hwnd = GetWindow(hwnd, GW_CHILD | GW_HWNDFIRST); возвращает NULL. Желательно перенести окно. Это 100% возможно. Есть программа Dexpot, которая спокойно переносит окна с одного десктопа на другой, но как она это делает непонятно... Пробовал SetParent() - окно якобы переносится и числится за текущим десктопом, но не перерисовывается и при попытке перемещения курсором вылетает... Может у кого, какие-то идеи будут...