函数

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. Django rest framework框架中有哪些组件

    认证 权限(授权) 用户访问次数/频率限制 版本 解析器(parser) 序列化 分页 路由系统 视图 渲染器 认证 自定义认证的类 """ from rest_fram ...

  2. dfs & bfs总结

    dfs 最简单的三种形式递归总结 bfs 百度https://baike.baidu.com/item/%E5%AE%BD%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7 ...

  3. Cisco AP-Mobility Express基础

    Part I 介绍 1.1基本概况 Cisco Mobility Express这个名词出现在Cisco “8”系列的AP上,例如现在的AP1852,AP2802,AP3802等都是Mobility ...

  4. mybatis源码探索笔记-3(使用代理mapper执行方法)

    前言 前面两章我们构建了SqlSessionFactory,并通过SqlSessionFactory创建了我们需要的SqlSession,并通过这个SqlSession获取了我们需要的代理mapper ...

  5. BGR 与 HSV 模式的转换规则

    HSV模式中的H.S.V分别表示色调.饱和度.亮度 RGB转化到HSV的算法:max=max(R,G,B) min=min(R,G,B) if R = max, H = (G-B)/(max-min) ...

  6. 最全BT磁力搜索引擎索引(整理分享,每日更新)

    btaa.xyz:http://www.veee.xyz/(可以访问,知名的BT磁力搜索,资源多,建议手机访问) 以下无法访问 idope.se:https://idope.se/(无法访问,资源丰富 ...

  7. jsp include参数传送接收与应用

    先看一个简单的应用,在a.jsp中写如下代码 <html> <head></head> <body> <div> <jsp:inclu ...

  8. java8新特性1:lambda表达式和函数式接口

    1.lambda的介绍: 1.1.为什么java语言需要引入lambda表达式? java语言诞生于1995年,历史时间已经相对较长了.在其后的各种新型编程语言中,都有着lambda表达式的内容,并且 ...

  9. 使用YII缓存注意事项

    在使用YII自身缓存时,在main.php文件配置中一定要配置keyPrefix,如下图: 'cache' => array( 'class' => 'CFileCache', 'keyP ...

  10. Java基础 -4.6

    循环嵌套 乘法口诀表 public static void main(String[] args) { for(int x =1;x<10;x++) { for(int y=1;y<=x; ...