c++ 枚举显示器设备参数,类型OBS显示名称规则
#include <iostream> #include <vector> #include <string> #include <Windows.h> #include <wingdi.h> #pragma comment(lib, "dxgi.lib") #pragma comment(lib, "user32.lib") using namespace std; struct MonitorInfo { int index; wstring name; // ✅ OBS 同款真实显示器名(DELL U2312HM / 2250) int x, y, w, h; bool isPrimary; wstring deviceId; // \\.\DISPLAY1 }; vector<MonitorInfo> g_monitors; // --------------------------------------------------------------------- // 核心:通过 DisplayConfig 获取显示器真实友好名称(OBS 源码同款) // --------------------------------------------------------------------- wstring GetMonitorFriendlyNameFromDisplayConfig(const wstring& deviceId) { UINT32 numPathArrayElements = 0, numModeInfoArrayElements = 0; if (GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &numPathArrayElements, &numModeInfoArrayElements) != ERROR_SUCCESS) return L"Unknown"; vector<DISPLAYCONFIG_PATH_INFO> paths(numPathArrayElements); vector<DISPLAYCONFIG_MODE_INFO> modes(numModeInfoArrayElements); if (QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &numPathArrayElements, paths.data(), &numModeInfoArrayElements, modes.data(), NULL) != ERROR_SUCCESS) return L"Unknown"; for (const auto& path : paths) { DISPLAYCONFIG_SOURCE_DEVICE_NAME sourceName{}; sourceName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME; sourceName.header.size = sizeof(sourceName); sourceName.header.adapterId = path.sourceInfo.adapterId; sourceName.header.id = path.sourceInfo.id; if (DisplayConfigGetDeviceInfo(&sourceName.header) == ERROR_SUCCESS) { // 匹配 \\.\DISPLAY1 这类设备ID if (deviceId == sourceName.viewGdiDeviceName) { DISPLAYCONFIG_TARGET_DEVICE_NAME targetName{}; targetName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME; targetName.header.size = sizeof(targetName); targetName.header.adapterId = path.sourceInfo.adapterId; targetName.header.id = path.targetInfo.id; if (DisplayConfigGetDeviceInfo(&targetName.header) == ERROR_SUCCESS) { // ✅ 这就是 OBS 显示的名字 return targetName.monitorFriendlyDeviceName; } } } } return L"Unknown Display"; } // --------------------------------------------------------------------- // 枚举显示器回调 // --------------------------------------------------------------------- BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC, LPRECT rect, LPARAM) { MONITORINFOEXW mi{}; mi.cbSize = sizeof(mi); GetMonitorInfoW(hMonitor, &mi); MonitorInfo info{}; info.index = (int)g_monitors.size(); info.x = rect->left; info.y = rect->top; info.w = rect->right - rect->left; info.h = rect->bottom - rect->top; info.isPrimary = !!(mi.dwFlags & MONITORINFOF_PRIMARY); info.deviceId = mi.szDevice; // ✅ 用 OBS 同款方法获取名称 info.name = GetMonitorFriendlyNameFromDisplayConfig(mi.szDevice); g_monitors.push_back(info); return TRUE; } // --------------------------------------------------------------------- // 输出 OBS 风格列表 // --------------------------------------------------------------------- void ListMonitorsLikeOBS() { g_monitors.clear(); EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, 0); _wsetlocale(LC_ALL, L"chs"); wcout << L"===== OBS 风格显示器列表 =====" << endl; for (const auto& m : g_monitors) { wcout << m.name << L": " << m.w << L"x" << m.h << L" @ " << m.x << L"," << m.y; if (m.isPrimary) wcout << L" (主显示器)"; wcout << endl; } } int main() { ListMonitorsLikeOBS(); system("pause"); return 0; }
更多推荐

所有评论(0)