函数

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. JavaSE复习~Java语言发展史

    Java概述 什么是Java语言? Java语言是美国Sun公司(Stanford University NetWork),在1995年推出的高级编程语言. 所谓编程语言,是计算机的语言,人们可以使用 ...

  2. linux文本处理工具-1

    文件内容: cat ,more,less 文件截取:head,tail 按列抽取:cut 排序和统计:sort,wc ----------------------------------------- ...

  3. IPSec的链路和设备备份

    链路备份的IPSec VPN和设备备份的IPSec VPN:首先实验的是链路备份的  IPSec VPN,下面是实验拓扑: IP地址配置:R1(Branch):Branch(config-if)#ip ...

  4. Web性能测试工具推荐

    WEB性能测试工具主要分为三种: 一种是测试页面资源加载速度的: 一种是测试页面加载完毕后页面呈现.JS操作速度的: 一种是总体上对页面进行评价分析. ~~~如果谁有更好的工具也请一起分享下   1. ...

  5. %E3%80%90%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E3%80%91

    "%3Cdiv%20class%3D%22htmledit_views%22%20id%3D%22content_views%22%3E%0A%20%20%20%20%20%20%20%20 ...

  6. device supports x86 but apk only supports armeabi-v7a问题解决

    我们可以在build.gradle中有ndk这段代码,只要在后面加上“x86”,再sync now一下,就发现可以运行了. ndk { abiFilters "armeabi-v7a&quo ...

  7. php 低版本不能使用php 命令,创建软链接

      ln -s /usr/local/php5/bin/php /usr/bin/php php 低版本不能使用php 命令,创建软链接   phpize 依赖于 phpcli 模式 所以php命令必 ...

  8. php面试题之PHP核心技术

    一.PHP核心技术 更多PHP相关知识请关注我的专栏PHP​zhuanlan.zhihu.com 1.写出一个能创建多级目录的PHP函数(新浪网技术部) <?php /** * 创建多级目录 * ...

  9. 笔记-javascript

    笔记-javascript 1.      简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部 ...

  10. 删除hdfs上的内容报错:rm: Cannot delete /wxcm/ Name node is in safe mode.

    问题:在执行删除hdfs上的内容时(hdfs dfs -rm -f -r -skipTrash /wxcm)报错:rm: Cannot delete /wxcm/ Name node is in sa ...