add
This commit is contained in:
parent
a626a07b15
commit
b019c00825
15
WinDevice/Utils/CmdUtil.cpp
Normal file
15
WinDevice/Utils/CmdUtil.cpp
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#include "CmdUtil.h"
|
||||||
|
|
||||||
|
#include <io.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
std::string CmdUtil::ExecuteCommand(const std::string& command)
|
||||||
|
{
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
12
WinDevice/Utils/CmdUtil.h
Normal file
12
WinDevice/Utils/CmdUtil.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
#include <io.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class CmdUtil
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static std::string ExecuteCommand(const std::string& command);
|
||||||
|
};
|
@ -4,6 +4,9 @@
|
|||||||
#include <dxgi.h>
|
#include <dxgi.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#include <winuser.h>
|
||||||
|
#include <highlevelmonitorconfigurationapi.h>
|
||||||
|
#include <physicalmonitorenumerationapi.h>
|
||||||
#include <cfgmgr32.h>
|
#include <cfgmgr32.h>
|
||||||
#include <comdef.h>
|
#include <comdef.h>
|
||||||
#include <Wbemidl.h>
|
#include <Wbemidl.h>
|
||||||
@ -11,11 +14,114 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "SysInfoUtil.h"
|
#include "SysInfoUtil.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
#define _CRT_NON_CONFORMING_SWPRINTFS
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
|
||||||
|
#include <tchar.h>
|
||||||
|
#include <initguid.h>
|
||||||
|
#include <wmistr.h>
|
||||||
|
DEFINE_GUID(WmiMonitorID_GUID, 0x671a8285, 0x4edb, 0x4cae, 0x99, 0xfe, 0x69, 0xa1, 0x5c, 0x48, 0xc0, 0xbc);
|
||||||
|
typedef struct WmiMonitorID {
|
||||||
|
USHORT ProductCodeID[16];
|
||||||
|
USHORT SerialNumberID[16];
|
||||||
|
USHORT ManufacturerName[16];
|
||||||
|
UCHAR WeekOfManufacture;
|
||||||
|
USHORT YearOfManufacture;
|
||||||
|
USHORT UserFriendlyNameLength;
|
||||||
|
USHORT UserFriendlyName[1];
|
||||||
|
} WmiMonitorID, * PWmiMonitorID;
|
||||||
|
#define OFFSET_TO_PTR(Base, Offset) ((PBYTE)((PBYTE)Base + Offset))
|
||||||
|
|
||||||
|
typedef HRESULT(WINAPI* WOB) (IN LPGUID lpGUID, IN DWORD nAccess, OUT LONG*);
|
||||||
|
WOB WmiOpenBlock;
|
||||||
|
typedef HRESULT(WINAPI* WQAD) (IN LONG hWMIHandle, ULONG* nBufferSize, OUT UCHAR* pBuffer);
|
||||||
|
WQAD WmiQueryAllData;
|
||||||
|
typedef HRESULT(WINAPI* WCB) (IN LONG);
|
||||||
|
WCB WmiCloseBlock;
|
||||||
|
|
||||||
|
void SysInfoUtil::GetInfoByEdid()
|
||||||
|
{
|
||||||
|
HRESULT hr = E_FAIL;
|
||||||
|
LONG hWmiHandle;
|
||||||
|
PWmiMonitorID MonitorID;
|
||||||
|
HINSTANCE hDLL = LoadLibrary(L"Advapi32.dll");
|
||||||
|
WmiOpenBlock = (WOB)GetProcAddress(hDLL, "WmiOpenBlock");
|
||||||
|
WmiQueryAllData = (WQAD)GetProcAddress(hDLL, "WmiQueryAllDataW");
|
||||||
|
WmiCloseBlock = (WCB)GetProcAddress(hDLL, "WmiCloseBlock");
|
||||||
|
if (WmiOpenBlock != NULL && WmiQueryAllData && WmiCloseBlock)
|
||||||
|
{
|
||||||
|
WCHAR pszDeviceId[256] = L"";
|
||||||
|
hr = WmiOpenBlock((LPGUID)&WmiMonitorID_GUID, GENERIC_READ, &hWmiHandle);
|
||||||
|
if (hr == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
ULONG nBufferSize = 0;
|
||||||
|
UCHAR* pAllDataBuffer = 0;
|
||||||
|
PWNODE_ALL_DATA pWmiAllData;
|
||||||
|
hr = WmiQueryAllData(hWmiHandle, &nBufferSize, 0);
|
||||||
|
if (hr == ERROR_INSUFFICIENT_BUFFER)
|
||||||
|
{
|
||||||
|
pAllDataBuffer = (UCHAR*)malloc(nBufferSize);
|
||||||
|
hr = WmiQueryAllData(hWmiHandle, &nBufferSize, pAllDataBuffer);
|
||||||
|
if (hr == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
pWmiAllData = (PWNODE_ALL_DATA)pAllDataBuffer;
|
||||||
|
if (pWmiAllData->WnodeHeader.Flags & WNODE_FLAG_FIXED_INSTANCE_SIZE)
|
||||||
|
MonitorID = (PWmiMonitorID)&pAllDataBuffer[pWmiAllData->DataBlockOffset];
|
||||||
|
else
|
||||||
|
MonitorID = (PWmiMonitorID)&pAllDataBuffer[pWmiAllData->OffsetInstanceDataAndLength[0].OffsetInstanceData];
|
||||||
|
|
||||||
|
ULONG nOffset = 0;
|
||||||
|
WCHAR* pwsInstanceName = 0;
|
||||||
|
nOffset = (ULONG)pAllDataBuffer[pWmiAllData->OffsetInstanceNameOffsets];
|
||||||
|
pwsInstanceName = (WCHAR*)OFFSET_TO_PTR(pWmiAllData, nOffset + sizeof(USHORT));
|
||||||
|
WCHAR wsText[255] = L"";
|
||||||
|
wcout << L"Instance =" << pwsInstanceName << endl;
|
||||||
|
// swprintf(wsText, L"Instance Name = %s\r\n", pwsInstanceName);
|
||||||
|
OutputDebugString(wsText);
|
||||||
|
|
||||||
|
WCHAR* pwsUserFriendlyName;
|
||||||
|
pwsUserFriendlyName = (WCHAR*)MonitorID->UserFriendlyName;
|
||||||
|
wcout << L"UserFriendlyName =" << pwsUserFriendlyName << endl;
|
||||||
|
// swprintf(wsText, L"User Friendly Name = %s\r\n", pwsUserFriendlyName);
|
||||||
|
OutputDebugString(wsText);
|
||||||
|
|
||||||
|
WCHAR* pwsManufacturerName;
|
||||||
|
pwsManufacturerName = (WCHAR*)MonitorID->ManufacturerName;
|
||||||
|
wcout << L"ManufacturerName =" << pwsManufacturerName << endl;
|
||||||
|
// swprintf(wsText, L"Manufacturer Name = %s\r\n", pwsManufacturerName);
|
||||||
|
OutputDebugString(wsText);
|
||||||
|
|
||||||
|
WCHAR* pwsProductCodeID;
|
||||||
|
pwsProductCodeID = (WCHAR*)MonitorID->ProductCodeID;
|
||||||
|
wcout << L"ProductCodeID =" << pwsProductCodeID << endl;
|
||||||
|
// swprintf(wsText, L"Product Code ID = %s\r\n", pwsProductCodeID);
|
||||||
|
OutputDebugString(wsText);
|
||||||
|
|
||||||
|
WCHAR* pwsSerialNumberID;
|
||||||
|
pwsSerialNumberID = (WCHAR*)MonitorID->SerialNumberID;
|
||||||
|
wcout << L"SerialNumberID =" << pwsSerialNumberID << endl;
|
||||||
|
// swprintf(wsText, L"Serial Number ID = %s\r\n", pwsSerialNumberID);
|
||||||
|
OutputDebugString(wsText);
|
||||||
|
|
||||||
|
if (!pWmiAllData->WnodeHeader.Linkage)
|
||||||
|
break;
|
||||||
|
pAllDataBuffer += pWmiAllData->WnodeHeader.Linkage;
|
||||||
|
}
|
||||||
|
free(pAllDataBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WmiCloseBlock(hWmiHandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SysInfoUtil::GetMacByGetAdaptersInfo(char* outMAC) const
|
void SysInfoUtil::GetMacByGetAdaptersInfo(char* outMAC) const
|
||||||
{
|
{
|
||||||
@ -185,26 +291,46 @@ void SysInfoUtil::GetInfoByEnumDisplayMonitors()
|
|||||||
{
|
{
|
||||||
wcout << "=====GetInfoByEnumDisplayMonitors start=====" << endl;
|
wcout << "=====GetInfoByEnumDisplayMonitors start=====" << endl;
|
||||||
// 枚举显示器
|
// 枚举显示器
|
||||||
EnumDisplayMonitors(NULL, NULL, [](HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) -> BOOL {
|
EnumDisplayMonitors(NULL, NULL, [](HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) -> BOOL
|
||||||
// 获取显示器的设备名称
|
{
|
||||||
MONITORINFOEX monitorInfo;
|
MONITORINFOEX monitorInfo;
|
||||||
monitorInfo.cbSize = sizeof(MONITORINFOEX);
|
monitorInfo.cbSize = sizeof(MONITORINFOEX);
|
||||||
if (GetMonitorInfo(hMonitor, &monitorInfo)) {
|
if (GetMonitorInfo(hMonitor, &monitorInfo))
|
||||||
std::wcout << L"name: " << monitorInfo.szDevice << std::endl;
|
{
|
||||||
|
// 输出友好名称
|
||||||
|
wcout << "szDevice:" << monitorInfo.szDevice << endl;
|
||||||
|
wcout << "right:" << monitorInfo.rcMonitor.right << endl;
|
||||||
|
wcout << "bottom:" << monitorInfo.rcMonitor.bottom << endl;
|
||||||
|
}
|
||||||
|
DISPLAYCONFIG_TARGET_DEVICE_NAME targetDeviceName = {};
|
||||||
|
targetDeviceName.header.size = sizeof(targetDeviceName);
|
||||||
|
|
||||||
// 获取显示器的屏幕区域
|
// 获取指定 HMONITOR 的目标设备名称信息
|
||||||
std::wcout << L"rect: left(" << lprcMonitor->left << ", " << lprcMonitor->top
|
if (DisplayConfigGetDeviceInfo(&targetDeviceName.header) == ERROR_SUCCESS)
|
||||||
<< "), right(" << lprcMonitor->right << ", " << lprcMonitor->bottom << ")" << std::endl;
|
{
|
||||||
|
wcout << L"Device Name: " << targetDeviceName.monitorFriendlyDeviceName << endl;
|
||||||
|
wcout << L"Source Name: " << targetDeviceName.monitorDevicePath << endl;
|
||||||
|
|
||||||
// 获取显示器的分辨率
|
// 获取指定 HMONITOR 的分辨率信息
|
||||||
std::wcout << L"dpi: w=" << lprcMonitor->right - lprcMonitor->left
|
DEVMODE dm;
|
||||||
<< ", h=" << lprcMonitor->bottom - lprcMonitor->top << std::endl;
|
dm.dmSize = sizeof(DEVMODE);
|
||||||
|
dm.dmDriverExtra = 0;
|
||||||
|
|
||||||
std::wcout << L"===================" << std::endl;
|
if (EnumDisplaySettings(targetDeviceName.monitorDevicePath, ENUM_CURRENT_SETTINGS, &dm) != 0)
|
||||||
|
{
|
||||||
|
wcout << L"Resolution: " << dm.dmPelsWidth << L" x " << dm.dmPelsHeight << endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wcout << L"Failed to get display resolution." << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wcout << L"------------------------------------------" << endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wcout << L"Failed to get display device info." << endl;
|
||||||
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}, 0);
|
}, 0);
|
||||||
wcout << "=====GetInfoByEnumDisplayMonitors end=====" << endl;
|
wcout << "=====GetInfoByEnumDisplayMonitors end=====" << endl;
|
||||||
@ -289,13 +415,21 @@ int SysInfoUtil::GetInfoByWMI()
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumWbemClassObject* pEnum = nullptr;
|
IEnumWbemClassObject* pPnPEntity = nullptr;
|
||||||
|
hr = pServices->ExecQuery(
|
||||||
|
bstr_t("WQL"),
|
||||||
|
bstr_t("SELECT * FROM Win32_PnPEntity where service=\"monitor\""),
|
||||||
|
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
|
||||||
|
nullptr,
|
||||||
|
&pPnPEntity);
|
||||||
|
|
||||||
|
IEnumWbemClassObject* pDesktopMonitor = nullptr;
|
||||||
hr = pServices->ExecQuery(
|
hr = pServices->ExecQuery(
|
||||||
bstr_t("WQL"),
|
bstr_t("WQL"),
|
||||||
bstr_t("SELECT * FROM Win32_DesktopMonitor"),
|
bstr_t("SELECT * FROM Win32_DesktopMonitor"),
|
||||||
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
|
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
|
||||||
nullptr,
|
nullptr,
|
||||||
&pEnum);
|
&pDesktopMonitor);
|
||||||
|
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
pServices->Release();
|
pServices->Release();
|
||||||
@ -304,30 +438,46 @@ int SysInfoUtil::GetInfoByWMI()
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
IWbemClassObject* pClassObject = nullptr;
|
IWbemClassObject* pPnPEntityClassObject = nullptr;
|
||||||
ULONG uReturn = 0;
|
ULONG uReturn = 0;
|
||||||
|
|
||||||
while (pEnum->Next(WBEM_INFINITE, 1, &pClassObject, &uReturn) == 0) {
|
while (pPnPEntity->Next(WBEM_INFINITE, 1, &pPnPEntityClassObject, &uReturn) == 0) {
|
||||||
|
VARIANT vtDeviceID;
|
||||||
|
VARIANT vtPNPDeviceID;
|
||||||
|
|
||||||
|
hr = pPnPEntityClassObject->Get(L"DeviceID", 0, &vtDeviceID, 0, 0);
|
||||||
|
hr = pPnPEntityClassObject->Get(L"PNPDeviceID", 0, &vtPNPDeviceID, 0, 0);
|
||||||
|
|
||||||
|
if (SUCCEEDED(hr) && vtDeviceID.vt == VT_BSTR && vtPNPDeviceID.vt == VT_BSTR) {
|
||||||
|
std::wcout << L"DeviceID: " << vtDeviceID.bstrVal << std::endl;
|
||||||
|
std::wcout << L"PNPDeviceID: " << vtPNPDeviceID.bstrVal << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
pPnPEntityClassObject->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
IWbemClassObject* pDesktopMonitorClassObject = nullptr;
|
||||||
|
ULONG uDeskReturn = 0;
|
||||||
|
while (pDesktopMonitor->Next(WBEM_INFINITE, 1, &pDesktopMonitorClassObject, &uDeskReturn) == 0) {
|
||||||
VARIANT vtDeviceID;
|
VARIANT vtDeviceID;
|
||||||
VARIANT vtScreenWidth;
|
VARIANT vtScreenWidth;
|
||||||
VARIANT vtScreenHeight;
|
VARIANT vtScreenHeight;
|
||||||
VARIANT vtModelName;
|
VARIANT vtPNPDeviceID;
|
||||||
|
|
||||||
hr = pClassObject->Get(L"DeviceID", 0, &vtDeviceID, 0, 0);
|
hr = pDesktopMonitorClassObject->Get(L"DeviceID", 0, &vtDeviceID, 0, 0);
|
||||||
hr = pClassObject->Get(L"ScreenWidth", 0, &vtScreenWidth, 0, 0);
|
hr = pDesktopMonitorClassObject->Get(L"ScreenWidth", 0, &vtScreenWidth, 0, 0);
|
||||||
hr = pClassObject->Get(L"ScreenHeight", 0, &vtScreenHeight, 0, 0);
|
hr = pDesktopMonitorClassObject->Get(L"ScreenHeight", 0, &vtScreenHeight, 0, 0);
|
||||||
hr = pClassObject->Get(L"MonitorType", 0, &vtModelName, 0, 0);
|
hr = pDesktopMonitorClassObject->Get(L"PNPDeviceID", 0, &vtPNPDeviceID, 0, 0);
|
||||||
|
|
||||||
if (SUCCEEDED(hr) && vtDeviceID.vt == VT_BSTR && vtScreenWidth.vt == VT_I4 && vtScreenHeight.vt == VT_I4 && vtModelName.vt == VT_BSTR) {
|
if (SUCCEEDED(hr) && vtDeviceID.vt == VT_BSTR && vtScreenWidth.vt == VT_I4 && vtScreenHeight.vt == VT_I4 ) {
|
||||||
std::wcout << L"设备名称: " << vtDeviceID.bstrVal << std::endl;
|
std::wcout << L"DeviceID: " << vtDeviceID.bstrVal << std::endl;
|
||||||
std::wcout << L"分辨率: " << vtScreenWidth.lVal << L"x" << vtScreenHeight.lVal << std::endl;
|
std::wcout << L"size: " << vtScreenWidth.lVal << L"x" << vtScreenHeight.lVal << std::endl;
|
||||||
std::wcout << L"型号: " << vtModelName.bstrVal << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pClassObject->Release();
|
pDesktopMonitorClassObject->Release();
|
||||||
}
|
}
|
||||||
|
pPnPEntity->Release();
|
||||||
pEnum->Release();
|
pDesktopMonitor->Release();
|
||||||
pServices->Release();
|
pServices->Release();
|
||||||
CoUninitialize();
|
CoUninitialize();
|
||||||
wcout << L"=====GetInfoByWMI end=====" << endl;
|
wcout << L"=====GetInfoByWMI end=====" << endl;
|
||||||
|
@ -16,9 +16,12 @@ public:
|
|||||||
|
|
||||||
static int GetInfoByQueryDisplayConfig();
|
static int GetInfoByQueryDisplayConfig();
|
||||||
|
|
||||||
static void GetInfoByEnumDisplayDevicesA();
|
static void GetInfoByEdid();
|
||||||
|
|
||||||
static int GetInfoByCfgmgr();
|
static int GetInfoByCfgmgr();
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
15
WinDevice/Video/ScreenManager.cpp
Normal file
15
WinDevice/Video/ScreenManager.cpp
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#include "ScreenManager.h"
|
||||||
|
|
||||||
|
|
||||||
|
void SceenManager::UpdateDisplayInfo()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SceenManager::_UpdateDisplayDeviceList()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SceenManager::_UpdateMonitorInfoMap()
|
||||||
|
{
|
||||||
|
}
|
16
WinDevice/Video/ScreenManager.h
Normal file
16
WinDevice/Video/ScreenManager.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
class SceenManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void UpdateDisplayInfo();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void _UpdateDisplayDeviceList();
|
||||||
|
void _UpdateMonitorInfoMap();
|
||||||
|
|
||||||
|
std::vector<DISPLAY_DEVICE> _displayDeviceList;
|
||||||
|
std::map<HMONITOR, MONITORINFOEX> _hMonitorInfoMap;
|
||||||
|
};
|
@ -5,25 +5,109 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <io.h>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <iphlpapi.h>
|
||||||
|
#include <dxgi.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winuser.h>
|
||||||
|
#include <highlevelmonitorconfigurationapi.h>
|
||||||
|
#include <physicalmonitorenumerationapi.h>
|
||||||
|
#include <cfgmgr32.h>
|
||||||
|
#include <comdef.h>
|
||||||
|
#include <Wbemidl.h>
|
||||||
|
#include <io.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <chrono>
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
#include "Utils/SysInfoUtil.h"
|
#include "Utils/SysInfoUtil.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
std::string ExecuteCommandLine(std::string cmd);
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
// 测量函数调用的耗时
|
// 测量函数调用的耗时
|
||||||
auto start = chrono::high_resolution_clock::now();
|
auto start = chrono::high_resolution_clock::now();
|
||||||
SysInfoUtil::GetInfoByEnumDisplayDevices();
|
// SysInfoUtil::GetInfoByEnumDisplayMonitors();
|
||||||
SysInfoUtil::GetInfoByEnumDisplayMonitors();
|
// SysInfoUtil::GetInfoByQueryDisplayConfig();
|
||||||
SysInfoUtil::GetInfoByWMI();
|
// SysInfoUtil::GetInfoByEnumDisplayDevices();
|
||||||
// SysInfoUtil::GetInfoByCfgmgr();
|
// SysInfoUtil::GetInfoByWMI();
|
||||||
SysInfoUtil::GetInfoByQueryDisplayConfig();
|
// SysInfoUtil::GetInfoByEdid();
|
||||||
|
// SysInfoUtil::GetInfoByQueryDisplayConfig();
|
||||||
|
std::string command = "wmic desktopmonitor get PNPDeviceId,ScreenWidth,ScreenHeight";
|
||||||
|
std::string commandOutput = ExecuteCommandLine(command);
|
||||||
|
// 使用 stringstream 分割命令输出
|
||||||
|
stringstream ss(commandOutput);
|
||||||
|
string line;
|
||||||
|
|
||||||
|
// 跳过第一行(属性名称)
|
||||||
|
getline(ss, line);
|
||||||
|
|
||||||
|
while (getline(ss, line)) {
|
||||||
|
string pnpDeviceId, screenWidth, screenHeight;
|
||||||
|
|
||||||
|
// 使用 stringstream 再次分割每行
|
||||||
|
stringstream lineStream(line);
|
||||||
|
|
||||||
|
// 读取属性值
|
||||||
|
lineStream >> pnpDeviceId >> screenWidth >> screenHeight;
|
||||||
|
|
||||||
|
// 输出解析的值
|
||||||
|
cout << "PNPDeviceId: " << pnpDeviceId << ", ScreenWidth: " << screenWidth << ", ScreenHeight: " << screenHeight << endl;
|
||||||
|
}
|
||||||
auto end = chrono::high_resolution_clock::now();
|
auto end = chrono::high_resolution_clock::now();
|
||||||
auto duration = chrono::duration_cast<chrono::milliseconds>(end - start);
|
auto duration = chrono::duration_cast<chrono::milliseconds>(end - start);
|
||||||
wcout << "Function call duration: " << duration.count() << " ms" << endl;
|
wcout << "Function call duration: " << duration.count() << " ms" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
std::string ExecuteCommandLine(std::string cmd)
|
||||||
|
{
|
||||||
|
|
||||||
|
std::string cmd_result = std::string();
|
||||||
|
|
||||||
|
char psBuffer[0x2000] = { 0 };
|
||||||
|
FILE* pPipe;
|
||||||
|
|
||||||
|
/* Run DIR so that it writes its output to a pipe. Open this
|
||||||
|
* pipe with read text attribute so that we can read it
|
||||||
|
* like a text file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ((pPipe = _popen(cmd.c_str(), "rt")) == NULL)
|
||||||
|
{
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read pipe until end of file, or an error occurs. */
|
||||||
|
|
||||||
|
while (fgets(psBuffer, 0x2000, pPipe))
|
||||||
|
{
|
||||||
|
cmd_result += psBuffer;
|
||||||
|
memset(psBuffer, 0, 0x2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
int endOfFileVal = feof(pPipe);
|
||||||
|
int closeReturnVal = _pclose(pPipe);
|
||||||
|
|
||||||
|
if (endOfFileVal)
|
||||||
|
{
|
||||||
|
printf("\nProcess returned %d\n", closeReturnVal);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Error: Failed to read the pipe to the end.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return cmd_result;
|
||||||
|
}
|
||||||
|
|
||||||
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
|
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
|
||||||
// 调试程序: F5 或调试 >“开始调试”菜单
|
// 调试程序: F5 或调试 >“开始调试”菜单
|
||||||
|
|
||||||
|
@ -146,14 +146,18 @@
|
|||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="Audio\AudioManager.cpp" />
|
<ClCompile Include="Audio\AudioManager.cpp" />
|
||||||
|
<ClCompile Include="Utils\CmdUtil.cpp" />
|
||||||
<ClCompile Include="Utils\SysInfoUtil.cpp" />
|
<ClCompile Include="Utils\SysInfoUtil.cpp" />
|
||||||
|
<ClCompile Include="Video\ScreenManager.cpp" />
|
||||||
<ClCompile Include="WinDevice.cpp" />
|
<ClCompile Include="WinDevice.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="Audio\AudioEnum.h" />
|
<ClInclude Include="Audio\AudioEnum.h" />
|
||||||
<ClInclude Include="Audio\AudioManager.h" />
|
<ClInclude Include="Audio\AudioManager.h" />
|
||||||
<ClInclude Include="stdafx.h" />
|
<ClInclude Include="stdafx.h" />
|
||||||
|
<ClInclude Include="Utils\CmdUtil.h" />
|
||||||
<ClInclude Include="Utils\SysInfoUtil.h" />
|
<ClInclude Include="Utils\SysInfoUtil.h" />
|
||||||
|
<ClInclude Include="Video\ScreenManager.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
@ -24,6 +24,12 @@
|
|||||||
<ClCompile Include="Utils\SysInfoUtil.cpp">
|
<ClCompile Include="Utils\SysInfoUtil.cpp">
|
||||||
<Filter>源文件</Filter>
|
<Filter>源文件</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="Utils\CmdUtil.cpp">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Video\ScreenManager.cpp">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="Audio\AudioEnum.h">
|
<ClInclude Include="Audio\AudioEnum.h">
|
||||||
@ -38,5 +44,11 @@
|
|||||||
<ClInclude Include="Utils\SysInfoUtil.h">
|
<ClInclude Include="Utils\SysInfoUtil.h">
|
||||||
<Filter>头文件</Filter>
|
<Filter>头文件</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="Utils\CmdUtil.h">
|
||||||
|
<Filter>头文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Video\ScreenManager.h">
|
||||||
|
<Filter>头文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
Loading…
Reference in New Issue
Block a user