函数

BOOL EnumDisplayDevicesA( LPCSTR lpDevice, DWORD iDevNum, PDISPLAY_DEVICEA lpDisplayDevice, DWORD dwFlags );

用于枚举显示设备信息。当lpDevice = NULL时,枚举视频卡(Display adapter)信息;当lpDevice = DISPLAY_DEVICE::DeviceName时,枚举显示器(monitor)信息;

函数

BOOL EnumDisplaySettingsA( LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA *lpDevMode );

用于枚举视频模式(Video mode)信息

范例:

 #pragma once

 #include <stdio.h>
#include <Windows.h>
#include <VersionHelpers.h> struct VIDEOMODE;
struct DISPLAY; typedef struct VIDEOMODE
{
VIDEOMODE* next; int width;
int height;
int red_bits;
int green_bits;
int blue_bits;
int refresh_rates; } *PVIDEOMODE; typedef struct DISPLAY
{
DISPLAY* next; TCHAR monitor_name[];
TCHAR adapter_name[];
int widthMM;
int heightMM; VIDEOMODE* pVideoMode;
VIDEOMODE* pCurrentMode; } *PDISPLAY; class CDispDeviceInfo
{
public: CDispDeviceInfo();
~CDispDeviceInfo(); bool CDispDeviceInfoInit();
DISPLAY* EnumDisplay(int index);
VIDEOMODE* EnumVideoModes(DISPLAY* adapter, int index);
VIDEOMODE* GetCurrentMode(); protected: void SpiltBPP(int color_bits, int* red_bits, int* green_bits, int* blue_bits);
bool CompareVideoMode(VIDEOMODE* adapter, VIDEOMODE* result);
DISPLAY* CreateMonitors(DISPLAY_DEVICEW* display, DISPLAY_DEVICEW* adapter);
VIDEOMODE* CreateVideoModes(DISPLAY_DEVICEW* adapter);
void CreateVideoMode(DEVMODE* devmode, VIDEOMODE* mode);
void FreeDispDevicesInfo(); DISPLAY* head;
VIDEOMODE* CurrentMode;
};

CDispDevice.h

 #include "CDispDevice.h"

 CDispDeviceInfo::CDispDeviceInfo()
{
head = nullptr;
CurrentMode = nullptr;
} CDispDeviceInfo::~CDispDeviceInfo()
{
this->FreeDispDevicesInfo();
} bool CDispDeviceInfo::CDispDeviceInfoInit()
{
DWORD adapterIndex, displayIndex;
DISPLAY_DEVICEW adapter, display; for (adapterIndex = ; ; adapterIndex++) { ZeroMemory(&adapter, sizeof(DISPLAY_DEVICEW));
adapter.cb = sizeof(DISPLAY_DEVICEW); if (!EnumDisplayDevices(NULL, adapterIndex, &adapter, ))
break; // skip unactive adapter
if (!(adapter.StateFlags & DISPLAY_DEVICE_ACTIVE))
continue; for (displayIndex = ; ; displayIndex++) { ZeroMemory(&display, sizeof(DISPLAY_DEVICEW));
display.cb = sizeof(DISPLAY_DEVICEW); if (!EnumDisplayDevices(adapter.DeviceName, displayIndex, &display, ))
break; // skip unactive monitor
if (!(display.StateFlags & DISPLAY_DEVICE_ACTIVE))
continue; PDISPLAY pDisp = CreateMonitors(&display, &adapter);
if (head) {
pDisp->next = head;
}
else
{
head = pDisp;
head->next = nullptr;
} }
} return true;
} DISPLAY* CDispDeviceInfo::EnumDisplay(int index)
{
PDISPLAY iter = head; if (!head)
return nullptr; for (int i = ; i < index; i++) {
if (!(iter = iter->next))
return nullptr;
} return iter;
} VIDEOMODE* CDispDeviceInfo::EnumVideoModes(DISPLAY* adapter, int index)
{
PVIDEOMODE iter = adapter->pVideoMode; if(!adapter->pVideoMode)
return nullptr; for (int i = ; i < index; i++) {
if (!(iter = iter->next))
return nullptr;
} return iter;
} void CDispDeviceInfo::SpiltBPP(int bpp, int* red_bits, int* green_bits, int* blue_bits)
{
if (bpp >= ) {
bpp = ;
} *red_bits = *green_bits = *blue_bits = bpp / ;
int delta = bpp - (*red_bits * );
if (delta >= ) {
*green_bits = *green_bits + ;
}
if (delta == ) {
*red_bits = *red_bits + ;
}
} bool CDispDeviceInfo::CompareVideoMode(VIDEOMODE* src, VIDEOMODE* result)
{
if (!(result && src))
{
return false;
} int r_bpp = result->red_bits + result->green_bits + result->blue_bits;
int r_area = result->width * result->height;
int t_bpp = src->red_bits + src->green_bits + src->blue_bits;
int t_area = src->width * src->height; if (src->refresh_rates == result->refresh_rates && r_bpp == t_bpp && r_area == t_area)
return true; return false;
} DISPLAY* CDispDeviceInfo::CreateMonitors(DISPLAY_DEVICEW* display, DISPLAY_DEVICEW* adapter)
{
DEVMODE dm;
HDC dc;
DISPLAY* pm; pm = (DISPLAY*)calloc(, sizeof(DISPLAY)); EnumDisplaySettings(adapter->DeviceName, ENUM_CURRENT_SETTINGS, &dm); dc = CreateDCW(L"DISPLAY", adapter->DeviceName, NULL, NULL);
if (!IsWindows8Point1OrGreater()) {
pm->widthMM = GetDeviceCaps(dc, HORZSIZE);
pm->heightMM = GetDeviceCaps(dc, VERTSIZE);
}
else
{
pm->widthMM = (int)(dm.dmPelsWidth * 25.4f / GetDeviceCaps(dc, LOGPIXELSX));
pm->heightMM = (int)(dm.dmPelsHeight * 25.4f / GetDeviceCaps(dc, LOGPIXELSY));
}
DeleteDC(dc); wcscpy_s(pm->adapter_name, adapter->DeviceString);
wcscpy_s(pm->monitor_name, display->DeviceString); pm->pVideoMode = this->CreateVideoModes(adapter); return pm;
} VIDEOMODE* CDispDeviceInfo::CreateVideoModes(DISPLAY_DEVICEW* adapter)
{
DEVMODEW devmode;
VIDEOMODE Mode, Current, * pMode = NULL;
bool firstCreate = true; ZeroMemory(&devmode, sizeof(devmode));
devmode.dmSize = sizeof(devmode);
if(!EnumDisplaySettings(adapter->DeviceName, , &devmode)){
return false;
}
else {
// Get current mode
EnumDisplaySettings(adapter->DeviceName, ENUM_CURRENT_SETTINGS, &devmode);
this->CreateVideoMode(&devmode, &Current);
} for (DWORD modesIndex = ;; modesIndex++) { ZeroMemory(&devmode, sizeof(devmode));
devmode.dmSize = sizeof(devmode);
if (!EnumDisplaySettings(adapter->DeviceName, modesIndex, &devmode))
break; // skip modes less than 15 BPP
if (devmode.dmBitsPerPel < )
continue; this->CreateVideoMode(&devmode, &Mode); // check duplicated mode
if (this->CompareVideoMode(&Mode, pMode))
continue;
if (!firstCreate) {
PVIDEOMODE pNextMode = (VIDEOMODE*)calloc(, sizeof(VIDEOMODE));
memcpy(pNextMode, &Mode, sizeof(Mode));
pNextMode->next = pMode;
pMode = pNextMode; // store current mode
if (this->CompareVideoMode(&Mode, &Current)) {
this->CurrentMode = pMode;
} }
else {
pMode = (VIDEOMODE*)calloc(, sizeof(VIDEOMODE));
memcpy(pMode, &Mode, sizeof(Mode));
} firstCreate = false;
} return pMode;
} VIDEOMODE* CDispDeviceInfo::GetCurrentMode()
{
return CurrentMode;
} void CDispDeviceInfo::CreateVideoMode(DEVMODE* devmode, VIDEOMODE* mode)
{
ZeroMemory(mode, sizeof(mode));
mode->width = devmode->dmPelsWidth;
mode->height = devmode->dmPelsHeight;
mode->refresh_rates = devmode->dmDisplayFrequency;
this->SpiltBPP(devmode->dmBitsPerPel, &mode->red_bits, &mode->green_bits, &mode->blue_bits);
} void CDispDeviceInfo::FreeDispDevicesInfo()
{
DISPLAY* dis_tmp;
VIDEOMODE* vid_tmp;
dis_tmp = head; for (; head;) {
if (head->pVideoMode) {
vid_tmp = head->pVideoMode; for (; head->pVideoMode;) {
head->pVideoMode = head->pVideoMode->next;
free(vid_tmp);
vid_tmp = head->pVideoMode;
} } head = head->next;
free(dis_tmp);
dis_tmp = head;
}
}

CDispDevice.cpp

 #include "CDispDevice.h"

 int main(int argc, char** argv)
{
DISPLAY* disp;
VIDEOMODE* vidmodes;
CDispDeviceInfo info;
info.CDispDeviceInfoInit(); vidmodes = info.GetCurrentMode();
printf("Current Mode: %d x %d (%d %d %d) %dHz\n", vidmodes->width, vidmodes->height,
vidmodes->red_bits, vidmodes->green_bits, vidmodes->blue_bits, vidmodes->refresh_rates); for (int i = ; disp = info.EnumDisplay(i);i++) {
wprintf(TEXT("Adapter Name: %s\n"), disp->adapter_name);
wprintf(TEXT("Monitor Name: %s\n"), disp->monitor_name);
printf("Monitor properties: Width: %dmm Height: %dmm\n", disp->widthMM, disp->heightMM);
printf("Display Modes : \n");
for (int k = ; vidmodes = info.EnumVideoModes(disp, k); k++) {
printf("%d:%d x %d (%d %d %d) %dHz\n",k , vidmodes->width, vidmodes->height,
vidmodes->red_bits, vidmodes->green_bits, vidmodes->blue_bits, vidmodes->refresh_rates);
}
}
return ;
}

main.cpp

运行环境: Visual Studio 2019

C语言 Win32 获取显示设备信息的更多相关文章

  1. Atitit.获取主板与bios序列号获取硬件设备信息  Wmi wmic 的作用

    Atitit.获取主板与bios序列号获取硬件设备信息  Wmi wmic 的作用 1 获取硬件核心基础核心基础Wmi1 2 其他资料2 3 Wmic WMI 命令行接口2 4 Atitit.获取主板 ...

  2. 【转】android 安卓APP获取手机设备信息和手机号码的代码示例

    http://blog.csdn.net/changemyself/article/details/7421476 下面我从安卓开发的角度,简单写一下如何获取手机设备信息和手机号码 准备条件:一部安卓 ...

  3. ?Object-C获取手机设备信息

    一.获取UiDevice设备信息 // 获取设备名称 NSString *name = [[UIDevice currentDevice] name]; // 获取设备系统名称 NSString *s ...

  4. android 安卓APP获取手机设备信息和手机号码的代码示例

    下面我从安卓开发的角度,简单写一下如何获取手机设备信息和手机号码 准备条件:一部安卓手机.手机SIM卡确保插入手机里.eclipse ADT和android-sdk开发环境 第一步:新建一个andro ...

  5. iOS开发-Object-C获取手机设备信息(UIDevice)

    一.获取UiDevice设备信息 // 获取设备名称 NSString *name = [[UIDevice currentDevice] name]; // 获取设备系统名称 NSString *s ...

  6. Python学习---Django的request扩展[获取用户设备信息]

    关于Django的request扩展[获取用户设备信息] settings.py INSTALLED_APPS = [ ... 'app01', # 注册app ] STATICFILES_DIRS ...

  7. JavaScript获取访问设备信息

    <html xmlns=http://www.w3.org/1999/xhtml> <head> <title>JavaScript获取访问设备信息</tit ...

  8. Qt 获取usb设备信息 hacking

    /************************************************************************** * Qt 获取usb设备信息 hacking * ...

  9. iOS开发-Swift获取手机设备信息(UIDevice)

    使用UiDevice获取设备信息 获取设备名称 let name = UIDevice.currentDevice().name 获取设备系统名称 let systemName = UIDevice. ...

随机推荐

  1. 使用命令将单个java文件打包为jar

    思路:先将java文件编译为class文件,然后再打包为jar 参考博文:https://www.cnblogs.com/sxdcgaq8080/p/8126770.html http://www.m ...

  2. JAVA web课堂测试1

    1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分)2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分)3性别:要求用单选框或下拉框实现 ...

  3. Ubuntu配置Python开发环境(PyCharm、Tensorflow)

    安装JDK: https://www.cnblogs.com/wanghuixi/p/9837229.html 安装Anaconda: 安装PyCharm: https://www.cnblogs.c ...

  4. 【PAT甲级】1058 A+B in Hogwarts (20 分)

    题意: 输入两组,每组三个非负整数A,B,C(A<=1e7,B<17,C<29),输出相加的和.(类似个位上29进制,十位上17进制运算) AAAAAccepted code: #d ...

  5. day03-MyBatis的动态SQL语句查询

    场景一: 例如当我们想实现这样的查询的时候之前的操作貌似满足不了我们.  场景二: 还有些时候我们如果输入的信息越多满足要求的就越多,所查找出来的用户就越少 当我们之输入姓名的时候可能查找出10个人, ...

  6. 解决fastjson反序列化日期0000-00-00失败的方案

    解决fastjson反序列化日期0000-00-00失败的方案 22 Jul 2016 一.案例场景复原 示例场景里涉及两个class:TestDemo.java, DateBeanDemo.java ...

  7. Aery的UE4 C++游戏开发之旅(4)加载资源&创建对象

    目录 资源的硬引用 硬指针 FObjectFinder<T> / FClassFinder<T> 资源的软引用 FSoftObjectPaths.FStringAssetRef ...

  8. springboot搭建的web数据提交乱码

    修改:application.yml或者application.properties文件 将 url: jdbc:mysql://127.0.0.1:3306/shiro 修改为: url: jdbc ...

  9. Lesson 14 The Butterfly Effect

    Why do small errors make it impossible to predict the weather system with a high degree of accuracy? ...

  10. 数据库框架DBUtils

    数据库有关框架 1.框架:提高开发效率.按部就班 2.数据库框架: ORM:Object Relation Mapping 对象关系映射.JavaBean --Object数据库----Relatio ...