1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2026-01-06 10:34:09 +00:00

Added DisplayInfo for Windows

This commit is contained in:
Bryan Roe
2021-05-16 13:47:28 -07:00
parent 6a2afb8f78
commit b2e78b23e1
2 changed files with 40 additions and 3 deletions

View File

@@ -218,9 +218,45 @@ BOOL CALLBACK DisplayInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprc
return TRUE;
}
BOOL CALLBACK DisplayInfoEnumProc_Info(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{
unsigned short* buffer = (unsigned short*)dwData;
MONITORINFOEX mi;
UNREFERENCED_PARAMETER(hdcMonitor);
UNREFERENCED_PARAMETER(lprcMonitor);
ZeroMemory(&mi, sizeof(mi));
mi.cbSize = sizeof(mi);
// Get the display information
if (!GetMonitorInfo(hMonitor, (LPMONITORINFO)&mi)) return TRUE;
int w = abs(mi.rcMonitor.left - mi.rcMonitor.right);
int h = abs(mi.rcMonitor.top - mi.rcMonitor.bottom);
int i = (int)(buffer[0]++);
int offset = (5 * i) + 4;
if ((((i + 1) * 10) + 4) > buffer[1]) { return(FALSE); }
buffer[offset] = (unsigned short)htons((unsigned short)(i+1)); // ID
buffer[offset+1] = (unsigned short)htons((unsigned short)(mi.rcMonitor.left)); // X
buffer[offset+2] = (unsigned short)htons((unsigned short)(mi.rcMonitor.top)); // Y
buffer[offset+3] = (unsigned short)htons((unsigned short)(w)); // WIDTH
buffer[offset+4] = (unsigned short)htons((unsigned short)(h)); // HEIGHT
return(TRUE);
}
void kvm_send_display_list(ILibKVM_WriteHandler writeHandler, void *reserved)
{
int i;
char dwData[4096];
((unsigned short*)dwData)[0] = (unsigned short)0;
((unsigned short*)dwData)[1] = (unsigned short)sizeof(dwData);
((unsigned short*)dwData)[2] = (unsigned short)htons((unsigned short)MNG_KVM_DISPLAY_INFO); // Write the type
if (EnumDisplayMonitors(NULL, NULL, DisplayInfoEnumProc_Info, (LPARAM)dwData))
{
((unsigned short*)dwData)[3] = (unsigned short)htons((((unsigned short*)dwData)[0]) * 10 + 4); // Length
writeHandler(dwData+4, (((unsigned short*)dwData)[0]) * 10 + 4, reserved);
}
// Not looked at the number of screens yet
if (SCREEN_COUNT == -1) return;
@@ -231,9 +267,9 @@ void kvm_send_display_list(ILibKVM_WriteHandler writeHandler, void *reserved)
{
// Only one display, send empty
((unsigned short*)buffer)[0] = (unsigned short)htons((unsigned short)MNG_KVM_GET_DISPLAYS); // Write the type
((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)(8)); // Write the size
((unsigned short*)buffer)[2] = (unsigned short)htons((unsigned short)(0)); // Screen Count
((unsigned short*)buffer)[3] = (unsigned short)htons((unsigned short)(0)); // Selected Screen
((unsigned short*)buffer)[1] = (unsigned short)htons((unsigned short)(8)); // Write the size
((unsigned short*)buffer)[2] = (unsigned short)htons((unsigned short)(0)); // Screen Count
((unsigned short*)buffer)[3] = (unsigned short)htons((unsigned short)(0)); // Selected Screen
writeHandler(buffer, 8, reserved);
}

View File

@@ -24,6 +24,7 @@ limitations under the License.
typedef enum RemoteManagementCommands
{
MNG_KVM_INPUT_LOCK = 87,
MNG_KVM_DISPLAY_INFO = 82,
MNG_KVM_NOP = 0,
MNG_KVM_KEY = 1,
MNG_KVM_KEY_UNICODE = 85,