- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用与通过 WinApi 获取显示名称相关的其他问题的答案中相同的方法(使用 EnumDisplayDevicesW
同时将设备名称作为第一个参数传递,类似于 this one ),我'我们已经取得了部分成功。我遇到的问题是我得到的信息不完整。右键单击桌面,选择“显示设置”,然后选择底部的“高级显示设置”,可以访问“高级显示设置”面板,显示以下内容:
DELL P2414H(DisplayPort)
AOC AG271QG
BenQ PJ
但是,通过使用 EnumDisplayDevicesW
调用,我提取了以下内容:
AOC AG271QG
DELL P2414H(DisplayPort)
Generic PnP Monitor
虽然顺序对我来说并不重要,但问题是我得到的是“Generic PnP Monitor”而不是更有用的“BenQ PJ”(这不是我希望的确切型号,但仍然至少提供了一些信息)。我可以做些什么来提取“BenQ PJ”而不是“Generic PnP Monitor”(最好保留在 WinApi 中)?
最佳答案
可以通过EDID获取显示器信息
EDID可以用WMI读取
比如用WmiOpenBlock等测试,减少C++中WMI的代码=>
我得到了我的显示器:
Instance Name = DISPLAY\PHLC085\4&20634529&0&UID65793_0
User Friendly Name = 247ELH
Manufacturer Name = PHL
Product Code ID = C085
Serial Number ID = AU01307001613
包含和定义=>
#define _CRT_NON_CONFORMING_SWPRINTFS
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#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;
测试代码=>
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"";
swprintf(wsText, L"Instance Name = %s\r\n", pwsInstanceName);
OutputDebugString(wsText);
WCHAR *pwsUserFriendlyName;
pwsUserFriendlyName = (WCHAR*)MonitorID->UserFriendlyName;
swprintf(wsText, L"User Friendly Name = %s\r\n", pwsUserFriendlyName);
OutputDebugString(wsText);
WCHAR *pwsManufacturerName;
pwsManufacturerName = (WCHAR*)MonitorID->ManufacturerName;
swprintf(wsText, L"Manufacturer Name = %s\r\n", pwsManufacturerName);
OutputDebugString(wsText);
WCHAR *pwsProductCodeID;
pwsProductCodeID = (WCHAR*)MonitorID->ProductCodeID;
swprintf(wsText, L"Product Code ID = %s\r\n", pwsProductCodeID);
OutputDebugString(wsText);
WCHAR *pwsSerialNumberID;
pwsSerialNumberID = (WCHAR*)MonitorID->SerialNumberID;
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);
}
}
关于c++ - 使用 WinApi 获取与 "Advanced display settings"面板中相同的显示名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56844002/
今天,我在 Windows 10 的“程序和功能”列表中看到了 2 个不同版本的 ARC,因此我选择卸载旧版本,因为我需要一些空间。在卸载结束时,它们都消失了! 所以,我从 https://insta
我刚买了一台更强大的电脑,安装了 composer 并想继续我的项目,但是当我使用 gii 时,它给了我这个错误。 我该如何解决?为什么我得到它?谢谢你。 最佳答案 解决了。自 2.0.13 起,类名
1、介绍 这是我的《Advanced .Net Debugging》这个系列的第十一篇文章,也是这个系列的最后一篇了。我已经把原书的前八章内容全部写完了,本来打算继续写第九章和第十章的内容,后
一、介绍 这是我的《Advanced .Net Debugging》这个系列的第十篇文章。这篇文章的内容是原书的第三部分的【高级主题】的第八章【事后调试】。前面几篇文章,我们介绍了很多工具,可以
一、介绍 这是我的《 Advanced .Net Debugging》这个系列的第八篇文章。这篇文章的内容是原书的第二部分的【调试实战】的第六章【同步】。我们经常写一些多线程的应用程序,写的多
一、介绍 这是我的《 Advanced .Net Debugging》这个系列的第九篇文章。这篇文章的内容是原书的第二部分的【调试实战】的第七章【互用性】。互用性包含两个方面,第一个方面就是托
一、简介 这是我的《Advanced .Net Debugging》这个系列的第七篇文章。这篇文章的内容是原书的第二部分的【调试实战】的第五章,这一章主要讲的是从根本上认识托管堆和垃圾回收。软件
一、简介 这是我的《 Advanced .Net Debugging》这个系列的第六篇文章。这篇文章的内容是原书的第二部分的【调试实战】的第四章。这章主要讲的是程序集加载器,比如:CLR 加载
一、简介 我曾看到过许多开发人员使用错误的工具来分析问题,更有甚者,有些人连任何工具都没有使用。他们采取的分析方法通常包括:输出更多的调试信息,或者做一
一、简介 我曾看到过许多开发人员使用错误的工具来分析问题,更有甚者,有些人连任何工具都没有使用。他们采取的分析方法通常包括:输出更多的调试信息,或者做一
一、简介 我曾看到过许多开发人员使用错误的工具来分析问题,更有甚者,有些人连任何工具都没有使用。他们采取的分析方法通常包括:输出更多的调试信息,或者做一
我是 yii2 的新手,当我使用 从存档中提取 yii2 高级内容时《基本应用模板》、《带有高级应用模板的Yii 2》当我在服务器上上传时,它显示空白页面。 我检查了 yii2 basic 它工作正常
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
如果我遗漏了任何重要的细节,我想提前道歉。 我正在尝试执行升级,在安装新版本之前应删除以前版本的软件(和所有组件)。 我会尽量避免让您厌烦细节,并说如果您进行“典型”安装,一切都会按计划进行。如果您选
您好,我正在尝试创建一个存储整数或字符串元素的通用列表迭代器。我正在尝试测试它调用 IteratorG advance(IteratorG it, int n) 函数的情况,该函数采用在列表 it 中
我想知道是否有任何可能的方法,使 MySQL 查询可以动态搜索 WHERE 子句中的任何内容。 例如,如果查询是 Select * from table where item = 'Dell Opti
我正在使用 PayPal Advanced,并使用用户定义的字段 USER1 - USER10 发送一些交易数据,这将帮助我在通过 Silent Post 请求返回时识别它。有谁知道这些 USERx
这个问题在这里已经有了答案: How to use "distanceTo", "advancedBy" to handle String in Xcode7 beta6 (2 个答案) 关闭 7
请告诉我如何提前获得 transactionHash? // I have these tx opts: var txOpts = { "to":"0x345cA3e014Aaf5dcA48805
我正在尝试使用 Eloquent 创建类似的东西。但是,我在使用 or 子句时遇到了麻烦。 SELECT * FROM table WHERE column1 = 1 AND column2 = 2
我是一名优秀的程序员,十分优秀!