Скриншот рабочего стола Windows при отсутствии залогиненного пользователя (С++)

280
23 ноября 2017, 03:55

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

void CaptureScreen(){
    int ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
    int ScreenWidth  = GetSystemMetrics(SM_CXSCREEN);
    if( ScreenWidth == 1366){ScreenWidth-=2;}
    ScreenFrameBufferSize = ScreenWidth * ScreenHeight * 3;
    HDC ScreenDC = GetDC(0);
    HDC MemoryDC = CreateCompatibleDC(ScreenDC);
    BITMAPINFO BMI;
    BMI.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    BMI.bmiHeader.biWidth = ScreenWidth;
    BMI.bmiHeader.biHeight = -ScreenHeight;
    BMI.bmiHeader.biCompression = BI_RGB;
    BMI.bmiHeader.biBitCount  = 24;
    BMI.bmiHeader.biPlanes = 1;
    unsigned char *ImageBuffer;
    HBITMAP hBitmap = CreateDIBSection(ScreenDC,&BMI,DIB_RGB_COLORS,(void**)&ImageBuffer,0,0);
    SelectObject(MemoryDC, hBitmap);
    BitBlt(MemoryDC, 0, 0, ScreenWidth, ScreenHeight, ScreenDC , 0, 0, SRCCOPY);
    CURSORINFO CursorInfo;
    CursorInfo.cbSize = sizeof(CursorInfo);
    if( GetCursorInfo(&CursorInfo)){
        ICONINFO IconInfo;
        GetIconInfo(CursorInfo.hCursor, &IconInfo);
        DeleteObject(IconInfo.hbmColor);
        DeleteObject(IconInfo.hbmMask);
        DrawIcon(MemoryDC, CursorInfo.ptScreenPos.x - IconInfo.xHotspot, CursorInfo.ptScreenPos.y - IconInfo.yHotspot, CursorInfo.hCursor);
    }
    DeleteDC(MemoryDC);
    ReleaseDC(NULL, ScreenDC);
    for(int i = 0; i < ScreenFrameBufferSize; i += 3){
        unsigned char ColorValue = ImageBuffer[i];
        ImageBuffer[i] = ImageBuffer[i + 2];
        ImageBuffer[i + 2] = ColorValue;
    }
    ScreenFrameBuffer = (unsigned char*)realloc(ScreenFrameBuffer, ScreenFrameBufferSize);
    compress_image_to_jpeg_file_in_memory(ScreenFrameBuffer, ScreenFrameBufferSize, ScreenWidth, ScreenHeight, 3, ImageBuffer, ScreenCompressor);
    DeleteObject(hBitmap);
}

...и передаёт jpeg-и на видеосервер. Проблема в том, что если к этому серверу никто не подключен (по RDP или тимвьюверу), то есть нет залогиненных пользователей, то стримится чёрный экран.

Как можно всегда видеть нормальные скриншоты, а не чёрные прямоугольники при отсутствии пользователей на сервере? Через код это реализуемо, или только в настройках Windows (10) надо что-то менять?

READ ALSO
C++ Poco Отправка post запроса

C++ Poco Отправка post запроса

Пытаюсь отправить запрос post но не получается, Get приходит а post нет

430
Узнать загруженность CPU C++

Узнать загруженность CPU C++

Здравствуйте, пытаюсь разбираться с WIN32 API, реши написать что-то на подобии диспетчера задач, но никак не могу понять как узнать нагруженность...

546
Узнать разрядность ОС Windows C++

Узнать разрядность ОС Windows C++

Здравствуйте, возник вопрос с тем, как узнать разрядность ОС WindowsПробовал через препроцессинг, но выдает неправильные данные

376
Данные из файла в вектор, массив типа point

Данные из файла в вектор, массив типа point

Всем доброго вечера, возник вопросИмеется файл, пусть будет обычный текстовый

350