函数

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. 【代码总结】PHP面向对象之类与对象

    一.类和对象的关系 类的实体化结果是对象,而对象的抽象就是类.在开发过程中,我们通常都是先抽象(幻想)出一个类,再用该类去创建对象(实现幻想的内容).在程序中,直接使用的是我们(实现幻想)的对象,而不 ...

  2. 吴裕雄--天生自然Numpy库学习笔记:NumPy 从已有的数组创建数组

    import numpy as np x = [1,2,3] a = np.asarray(x) print (a) import numpy as np x = (1,2,3) a = np.asa ...

  3. 吴裕雄 python 神经网络——TensorFlow 输入数据处理框架

    import tensorflow as tf files = tf.train.match_filenames_once("E:\\MNIST_data\\output.tfrecords ...

  4. HDU1495 非常可乐(BFS/数论)

    大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但see ...

  5. Ext里dialog弹窗关闭与父窗口刷新问题总结

    1.弹出弹窗的js代码 var dlg = new J.dialog({ id: 'unDelTel', title:'缴费', page:encodeURI('<%=basePath%> ...

  6. Java IO流详解(四)——字符流Reader和Writer

    前面一章介绍了字节流的使用,提到了字节流在处理utf-8编码的中文可能会出现乱码的情况(其他编码的中文同样会出现乱码),所以Java针对这一情况提供了字符流. 但是字符流只能处理字符,不能用来处理 . ...

  7. 关于 UIDatePicker 在iOS9 系统上的一个坑

    在使用 UIDatePicker时,在iOS9系统上上遇到一个很奇怪的问题,在其他系统版本中没发现,设置年月日格式显示的视图,在iOS9设备上出现中间月份无法显示的问题: 检查代码没问题,这个视图是使 ...

  8. Sqlserver 日志文件收缩命令

    SELECT NAME,recovery_model_desc FROM sys.databases -- 如果是FULL类型,修改为SIMPLE类型 ALTER DATABASE DBName SE ...

  9. nginx 重写 隐藏index.php

    修改 nginx.conf 文件location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break ...

  10. Docker 之registry私有仓库搭建

    Docker 之registry私有仓库搭建 官方提供的私有仓库docker registry用法 https://yeasy.gitbooks.io/docker_practice/reposito ...