Если сделать снимок экрана в Windows, появится изображение черного экрана.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Если сделать снимок экрана в Windows, появится изображение черного экрана.

Сообщение Гость »


Я пытаюсь сделать скриншот всей страницы в Windows. функция работает при первом вызове, но после второго вызова вообще не работает и просто получает изображение черного экрана стабильного размера.
когда я использую отладчик, функция работает хорошо, не создавая черного экрана.
Вот код:

Код: Выделить всё

void screenshot(std::string imageaPath)
{
ULONG_PTR gdiplustoken;
Gdiplus::GdiplusStartupInput gdistartupinput;
Gdiplus::GdiplusStartupOutput gdistartupoutput;

gdistartupinput.SuppressBackgroundThread = true;
GdiplusStartup(&gdiplustoken, &gdistartupinput, &gdistartupoutput); //start GDI+

HDC hScreenDC = GetDC(GetDesktopWindow());
HDC hMemoryDC = CreateCompatibleDC(hScreenDC);

int cx = GetSystemMetrics(SM_CXVIRTUALSCREEN);
int cy = GetSystemMetrics(SM_CYVIRTUALSCREEN);
int x = GetSystemMetrics(SM_XVIRTUALSCREEN);
int y = GetSystemMetrics(SM_YVIRTUALSCREEN);

HBITMAP hbitmap = CreateCompatibleBitmap(hScreenDC, cx, cy);
HBITMAP holdbitmap = static_cast(SelectObject(hMemoryDC, hbitmap));

BitBlt(hMemoryDC, 0, 0, cx, cy, hScreenDC, x, y, SRCCOPY | CAPTUREBLT);
hbitmap = static_cast(SelectObject(hMemoryDC, holdbitmap));

UINT num, size;

Gdiplus::ImageCodecInfo* imagecodecinfo;
Gdiplus::GetImageEncodersSize(&num, &size); // get count of codec

imagecodecinfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
GetImageEncoders(num, size, imagecodecinfo);//get codec

CLSID clsidEncoder;

for (int i = 0; i < num; i++)
{
if (wcscmp(imagecodecinfo[i].MimeType, L"image/jpeg") == 0)
clsidEncoder = imagecodecinfo[i].Clsid; // get jpeg codec id
}

free(imagecodecinfo);
Gdiplus::Bitmap* bm = new Gdiplus::Bitmap(hbitmap, NULL);
std::wstring ws;
ws.assign(imageaPath.begin(), imageaPath.end());//sring to wstring
bm->Save(ws.c_str(), &clsidEncoder); //save in jpeg format
SelectObject(hMemoryDC, holdbitmap);//Release Objects
DeleteObject(hMemoryDC);
DeleteObject(hbitmap);
ReleaseDC(GetDesktopWindow(), hScreenDC);

Gdiplus::GdiplusShutdown(gdiplustoken);
}
update:
Okay i find a way to take a screenshot without black screen image
when i use

Код: Выделить всё

system("pause");
to make program stop and when press enter to make program continue, it's working, I used c++ sleep methods but not works, any idea?

Код: Выделить всё

...
HBITMAP holdbitmap = static_cast(SelectObject(hMemoryDC, hbitmap));

system("pause");

BitBlt(hMemoryDC, 0, 0, cx, cy, hScreenDC, x, y, SRCCOPY | CAPTUREBLT);
...
sleep methods:

Код: Выделить всё

Sleep(1000);
std::this_thread::sleep_for(std::chrono::seconds(1));
update 2:
I was sending screenshot request using curl and I was testing in a server(rdp) and I was logged out when i was sending request, I think sleep mode in server is enabled and when I logged out the server will be sleep and it's like computer screen to go dark and that's why BitBlt() fails and GetLastError() will return 5 which means access denied


Источник: https://stackoverflow.com/questions/683 ... reen-image
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Сделать снимок экрана во время записи экрана с помощью MediaProjection API.
    Anonymous » » в форуме Android
    0 Ответы
    110 Просмотры
    Последнее сообщение Anonymous
  • Как сделать снимок экрана и загрузить изображение по FTP в Python?
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Как получить снимок экрана для экрана размером 5,5 дюйма в Xcode 15 на Sonoma
    Гость » » в форуме IOS
    0 Ответы
    94 Просмотры
    Последнее сообщение Гость
  • Снимок экрана C# с областью экрана с поиском по шаблону (Emgu CV v4.9)
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Снимок экрана C# с областью экрана с поиском по шаблону (Emgu CV v4.9)
    Anonymous » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»