Add displayinfo_win.cpp — Windows display enumeration using Win32 API
This commit is contained in:
parent
d5de1a01c4
commit
7f5cc0d390
1 changed files with 63 additions and 0 deletions
63
src/wg/displayinfo_win.cpp
Normal file
63
src/wg/displayinfo_win.cpp
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
// src/wg/displayinfo_win.cpp — Windows implementation of display enumeration.
|
||||||
|
//
|
||||||
|
// Uses Win32 API: EnumDisplayMonitors, GetMonitorInfoW, EnumDisplayDevicesW, WideCharToMultiByte.
|
||||||
|
|
||||||
|
#include "displayinfo.h"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace wg {
|
||||||
|
|
||||||
|
// UTF-16 to UTF-8 conversion helper.
|
||||||
|
static std::string wideToUtf8(const wchar_t *wide) {
|
||||||
|
if (!wide) return "";
|
||||||
|
int len = WideCharToMultiByte(CP_UTF8, 0, wide, -1, nullptr, 0, nullptr, nullptr);
|
||||||
|
if (len <= 0) return "";
|
||||||
|
std::string utf8(len - 1, '\0');
|
||||||
|
WideCharToMultiByte(CP_UTF8, 0, wide, -1, &utf8[0], len, nullptr, nullptr);
|
||||||
|
return utf8;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Monitor enumeration callback.
|
||||||
|
static BOOL CALLBACK monitorEnumProc(HMONITOR hmon, HDC, LPRECT, LPARAM lParam) {
|
||||||
|
auto *displays = static_cast<std::vector<DisplayInfo> *>(reinterpret_cast<void *>(lParam));
|
||||||
|
|
||||||
|
MONITORINFOEX mi = {};
|
||||||
|
mi.cbSize = sizeof(mi);
|
||||||
|
if (!GetMonitorInfoW(hmon, &mi)) {
|
||||||
|
return TRUE; // Continue enumeration
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get friendly device name via EnumDisplayDevicesW.
|
||||||
|
DISPLAY_DEVICEW dd = {};
|
||||||
|
dd.cb = sizeof(dd);
|
||||||
|
EnumDisplayDevicesW(mi.szDevice, 0, &dd, 0);
|
||||||
|
|
||||||
|
DisplayInfo info;
|
||||||
|
info.name = wideToUtf8(mi.szDevice);
|
||||||
|
info.friendlyName = wideToUtf8(dd.DeviceString);
|
||||||
|
if (info.friendlyName.empty()) {
|
||||||
|
info.friendlyName = info.name;
|
||||||
|
}
|
||||||
|
info.width = mi.rcMonitor.right - mi.rcMonitor.left;
|
||||||
|
info.height = mi.rcMonitor.bottom - mi.rcMonitor.top;
|
||||||
|
info.isPrimary = (mi.dwFlags & MONITORINFOF_PRIMARY) != 0;
|
||||||
|
|
||||||
|
displays->push_back(info);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<DisplayInfo> enumerateDisplays() {
|
||||||
|
std::vector<DisplayInfo> displays;
|
||||||
|
EnumDisplayMonitors(nullptr, nullptr, monitorEnumProc,
|
||||||
|
reinterpret_cast<LPARAM>(&displays));
|
||||||
|
return displays;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace wg
|
||||||
|
|
||||||
|
#endif // _WIN32
|
||||||
Loading…
Reference in a new issue