Господа! Вот метод создания screenshot десктопа: int CreateScreenshot(HBITMAP *Screenshot, HDC *hDC) { HDC hdcScreen = GetDC(GetDesktopWindow()); HDC hdcCompatible = CreateCompatibleDC(hdcScreen); HBITMAP hbmScreen = CreateCompatibleBitmap( hdcScreen, GetDeviceCaps(hdcScreen, HORZRES), GetDeviceCaps(hdcScreen, VERTRES)); if (hbmScreen == 0) { return 0; } if (!SelectObject(hdcCompatible, hbmScreen)) { return 0; } if (!BitBlt(hdcCompatible, 0, 0, GetDeviceCaps(hdcScreen, HORZRES), GetDeviceCaps(hdcScreen, VERTRES), hdcScreen, 0, 0, SRCCOPY | CAPTUREBLT)) { /* here */ int err = GetLastError(); return 0; } *Screenshot = hbmScreen; *hDC = hdcCompatible; return 1; } Вызывается так: HDC hdc; HBITMAP hScreenshot; SetThreadDesktop(hDesktop); int res = CreateScreenshot(&hScreenshot, &hdc); Если перед этим делается SwitchDesktop(hDesktop), десктоп становится активным, то все работает отлично. Если десктоп неактивный, функция BitBlt возвращает ошибку: err = ERROR_INVALID_HANDLE. Не понимаю, почему! Нужна ваша помощь!
вероятно возвращается NULL в HDC hdcScreen = GetDC(GetDesktopWindow()); Попробуй там проверить hdcScreen!=NULL и если равен, то GetLastError
А так? Код (Text): hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); hdcCompatible = CreateCompatibleDC(hdcScreen);
Нет! Пробовал различные варианты.. Ошибку возвращает BitBlt, err = INVALID_HANDLE (6) Хотя все функции, которые возвращают handle, работают без ошибок, возвращают != NULL. И GetLastError для них возвращает 0. Я не знаю.. как решить.. видно дело дейсвительно в NtGdiBitBlt (win32k.sys), но трассировать пока не стал.. может кто-нить встречался с такой проблемой?
Это пример того, как получить screenshot активного десктопа.. Если запустить так: hDesktop = CreateDesktop(L"Default1", NULL, NULL, 0, GENERIC_ALL, NULL); PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&pi, sizeof(pi)); ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.lpDesktop = _tcsdup(L"WinSta0\\Default1"); res = CreateProcess(NULL, _tcsdup("screen.exe"), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); то screenshot'а не будет!