На удалённом сервере запущена программа, деятельность которой хочется мониторить через централизованную систему наблюдения. Вместе с ней на сервере запущен стрим-клиент, который пару-тройку раз в секунду "щёлкает" экран такой функцией:
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) надо что-то менять?
Сборка персонального компьютера от Artline: умный выбор для современных пользователей