Проблема в следующем: в приложени создается новый рабочий стол (CreateDesktop) и новый поток. Поток выбирает себе вновь созданный рабочий стол в качастве текущего (SetThreadDesktop). Запускает в нем несколько процессов. Затем ожидает сигнала от пользователя. Закрывает процессы. И сам завершается. Вопрос в следующем пользователь должен видеть часть созданного рабочего стола, я получаю изображение через StretchBlt - если не создавать рабочий стол, а запускать все на текущем то все работает. На созданном рабочем столе StretchBlt возбращает ошибку. GetLastError говорит - "Отказано в доступе". Все действия выполняются под пользователем Администратор. Код примерно такой: Код (Text): int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { instance = hInstance; HDESK newdesk; HANDLE deskthrd; DWORD thrdid; newdesk = CreateDesktop("temp", NULL, NULL, 0, GENERIC_ALL, NULL); if (newdesk == NULL) return(-1); deskthrd = CreateThread(NULL, 512, DeskThreadProc, &newdesk, CREATE_SUSPENDED, &thrdid); if (deskthrd == NULL) return(-2); SetThreadPriority(deskthrd, THREAD_PRIORITY_BELOW_NORMAL); ResumeThread(deskthrd); WaitForSingleObject(deskthrd, INFINITE); CloseHandle(deskthrd); CloseDesktop(newdesk); return(0); } DWORD WINAPI DeskThreadProc(LPVOID lpParameter) { DWORD curid; curid = GetCurrentThreadId(); HDESK newdesk, olddesk; newdesk = *(HDESK *) lpParameter; olddesk = GetThreadDesktop(curid); if (SetThreadDesktop(newdesk) == FALSE) ExitThread(1); // SwitchDesktop(newdesk); HDC deskdc, backdc; HBITMAP backbm, oldbm; deskdc = GetDC(NULL); backdc = CreateCompatibleDC(deskdc); backbm = CreateCompatibleBitmap(deskdc, 256, 256); oldbm = (HBITMAP) SelectObject(backdc, backbm); if (StretchBlt(backdc, 0, 0, 256, 256, deskdc, 0, 0, 1280, 1024, SRCCOPY) == FALSE) { ErrorExit(); }; ReleaseDC(NULL, deskdc); if (SetThreadDesktop(olddesk) == FALSE) ExitThread(4); // SwitchDesktop(olddesk); deskdc = GetDC(NULL); if (StretchBlt(deskdc, 0, 0, 1280, 1024, backdc, 0, 0, 256, 256, SRCCOPY) == FALSE) { ErrorExit(); }; ReleaseDC(NULL, deskdc); ExitThread(0); }; void ErrorExit(void) { LPTSTR pszMessage; DWORD dwLastError = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&pszMessage, 0, NULL ); HDESK dsk = OpenInputDesktop(0, false, GENERIC_ALL); SetThreadDesktop(dsk); MessageBox(0, pszMessage, NULL, 0); CloseDesktop(dsk); LocalFree(pszMessage); ExitProcess(1); } Если раскомментировать SwitchDesktop то все работает. Но на экране отображается созданный рабочий стол. В чем может быть проблема и куда копать?