函数

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. AngularJS学习:第一个demo

    1. 引入angular.js 相应版本下载地址: https://code.angularjs.org/ 2. 编写html <!DOCTYPE html> <html> & ...

  2. 运营商如何关闭2G、3G网络?这事儿得从小灵通说起

    5G时代即将全面开启,主流声音是对未来的无限畅想--5G将带来翻天覆地的变化.不过凡事都有利弊两面性,5G作为新生事物固然大有可为,但不可避免地会对旧事物造成巨大冲击.除了会影响很多跟不上潮流发展的行 ...

  3. 查看服务器CPU相关信息!

    # 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l # 查看每个物理CPU中core的个数(即 ...

  4. LinkList(链表)

    code: #include <stdio.h> #include <time.h> #include <conio.h> #include <stdlib. ...

  5. Dart语言学习(十五) Dart函数方法

    Dart函数方法可分为两类: 一.内置方法/函数: print(); 二.自定义方法: 自定义方法的基本格式: 返回类型 方法名称(参数1,参数2,...){ 方法体 return 返回值; } vo ...

  6. Java连载66-数组的两种初始化方式

    一.数组 1.数组中存储元素的类型是统一的,每一个元素在内存中所占用的空间大小是相同的,知道数组的首元素的内存地址,要查找的元素只要知道下标,就可以快速的计算出偏移量,通过首元素内存地址加上偏移量,就 ...

  7. BUUCTF知识记录

    [强网杯 2019]随便注 先尝试普通的注入 发现注入成功了,接下来走流程的时候碰到了问题 发现过滤了select和where这个两个最重要的查询语句,不过其他的过滤很奇怪,为什么要过滤update, ...

  8. VM安装linux操作系统详细教程

    1.首先我们新建一个虚拟机,先不安装操作系统,稍后再对其安装Linux系统. 新建虚拟机步骤如下: 打开VMware软件,菜单栏点击“文件(F)”–>选择“新建虚拟机(N)”,如下图1,(或者直 ...

  9. Java1.7已经舍弃substr了

    网上一堆在写substring和substr区别的文章,都是过时的. 起码在官方6.0的api文档中已经找不到了,只有substring()

  10. Linux Kernel 5.5 最终删除 SYSCTL 系统调用

    导读 Linux Kernel 5.5 最终消除了支持sysctl系统调用的代码,该代码已被弃用了大约十年,目前对任何体系结构的现代系统都没有影响. 长期以来,Linux sysctl系统调用都不建议 ...