先介绍一下单词metric,作为名词的时候有“度量标准,度量”的意思。所以system metric的意思是“系统度量单位”。

接下来就要介绍一下GetSystemMetrics函数。
功能:得到被定义的系统数据或者系统配置信息。
语法:
int WINAPI GetSystemMetrics(_in int nIndex);
参数:
只有一个参数index,我们称之为索引。这个索引有75个标识符,部分如下:

SM_CXSCREEN = 0 'X Size of screen
SM_CYSCREEN = 1 'Y Size of Screen
SM_CXVSCROLL = 2 'X Size of arrow in vertical scroll bar.
SM_CYHSCROLL = 3 'Y Size of arrow in horizontal scroll bar
SM_CYCAPTION = 4 'Height of windows caption
SM_CXBORDER = 5 'Width of no-sizable borders
SM_CYBORDER = 6 'Height of non-sizable borders
SM_CXDLGFRAME = 7 'Width of dialog box borders
SM_CYDLGFRAME = 8 'Height of dialog box borders
SM_CYHTHUMB = 9 'Height of scroll box on horizontal scroll bar
SM_CXHTHUMB = 10 ' Width of scroll box on horizontal scroll bar
SM_CXICON = 11 'Width of standard icon
SM_CYICON = 12 'Height of standard icon
SM_CXCURSOR = 13 'Width of standard cursor
SM_CYCURSOR = 14 'Height of standard cursor
SM_CYMENU = 15 'Height of menu
SM_CXFULLSCREEN = 16 'Width of client area of maximized window
SM_CYFULLSCREEN = 17 'Height of client area of maximized window
SM_CYKANJIWINDOW = 18 'Height of Kanji window
SM_MOUSEPRESENT = 19 'True is a mouse is present
SM_CYVSCROLL = 20 'Height of arrow in vertical scroll bar
SM_CXHSCROLL = 21 'Width of arrow in vertical scroll bar
SM_DEBUG = 22 'True if deugging version of windows is running
SM_SWAPBUTTON = 23 'True if left and right buttons are swapped.
SM_CXMIN = 28 'Minimum width of window
SM_CYMIN = 29 'Minimum height of window
SM_CXSIZE = 30 'Width of title bar bitmaps
SM_CYSIZE = 31 'height of title bar bitmaps
SM_CXMINTRACK = 34 'Minimum tracking width of window
SM_CYMINTRACK = 35 'Minimum tracking height of window
SM_CXDOUBLECLK = 36 'double click width
SM_CYDOUBLECLK = 37 'double click height
SM_CXICONSPACING = 38 'width between desktop icons
SM_CYICONSPACING = 39 'height between desktop icons
SM_MENUDROPALIGNMENT = 40 'Zero if popup menus are aligned to the left of the memu bar item. True if it is aligned to the right.
SM_PENWINDOWS = 41 'The handle of the pen windows DLL if loaded.
SM_DBCSENABLED = 42 'True if double byte characteds are enabled
SM_CMOUSEBUTTONS = 43 'Number of mouse buttons.
SM_CMETRICS = 44 'Number of system metrics
SM_CLEANBOOT = 67 'Windows 95 boot mode. 0 = normal, 1 = safe, 2 = safe with network
SM_CXMAXIMIZED = 61 'default width of win95 maximised window
SM_CXMAXTRACK = 59 'maximum width when resizing win95 windows
SM_CXMENUCHECK = 71 'width of menu checkmark bitmap
SM_CXMENUSIZE = 54 'width of button on menu bar
SM_CXMINIMIZED = 57 'width of rectangle into which minimised windows must fit.
SM_CYMAXIMIZED = 62 'default height of win95 maximised window
SM_CYMAXTRACK = 60 'maximum width when resizing win95 windows
SM_CYMENUCHECK = 72 'height of menu checkmark bitmap
SM_CYMENUSIZE = 55 'height of button on menu bar
SM_CYMINIMIZED = 58 'height of rectangle into which minimised windows must fit.
SM_CYSMCAPTION = 51 'height of windows 95 small caption
SM_MIDEASTENABLED = 74 'Hebrw and Arabic enabled for windows 95
SM_NETWORK = 63 'bit o is set if a network is present.
SM_SECURE = 44 'True if security is present on windows 95 system
SM_SLOWMACHINE = 73 'true if machine is too slow to run win95.

所以我们就可以通过下面两条代码获得计算机的屏幕分辨率:

int m_nWindwMetricsX = ::GetSystemMetrics(SM_CXSCREEN);
int m_nWindwMetricsY = ::GetSystemMetrics(SM_CYSCREEN);

下面介绍一个结构体DEVMODE
DEVMODE数据结构中包含了有关设备初始化和打印机环境的信息
DEVMODE结构具有如下形式:

typedef struct _devicemode
{ /* dvmd */
TCHAR dmDeviceName[32];
WORD dmSpecVersion;
WORD dmDriverVersion;
WORD dmSize;
WORD dmDriverExtra;
DWORD dmFields;
short dmOrientation;
short dmPaperSize;
short dmPaperLength;
short dmPaperWidth;
short dmScale;
short dmCopies;
short dmDefaultSource;
short dmPrintQuality;
short dmColor;
short dmDuplex;
short dmYResolution;
short dmTTOption;
short dmCollate;
TCHAR dmFormName[32];
WORD dmUnusedPadding;
USHORT dmBitsPerPel;
DWORD dmPelsWidth;
DWORD dmPelsHeight;
DWORD dmDisplayFlags;
DWORD dmDisplayFrequency;
} DEVMODE;

部分成员介绍:
dmDeviceName 指定了驱动程序支持的设备名称;例如,对于PCL/HP LaserJet系列,会是CL/HP激光打印机。这个字符串在设备驱动程序之间是相互不同的。

dmSpecVersion 指定了初始化数据的版本数字,这个结构就基于这些数据。

dmDriverVersion 指定了打印机驱动程序开发商分配的打印机驱动程序版本号。

dmSize 指定了DEVMODE结构的大小,以字节为单位,不包括dmDriverData(与设备有关)成员。如果应用程序仅操作数据中与驱动程序无关的部分,它就可以使用这个成员以确定该结构的长度,而并不需要有不同版本的记录。

dmDriverExtra 包含了这个结构后面的私有驱动程序数据的数目,以字节为单位。如果设备驱动程序不使用该设备独有的信息,就把这个成员设为零。

dmFields 指定了DEVMODE结构的其余成员中哪些已被初始化。第0位(定义为DM)ORIENTATION)代表dmOrientation,第1位(定义为 DM_PAPERSIZE)代表dmPaperSize等等。打印机驱动出现仅支持那些适合打印技术的成员。

dmOrientation 选择纸的方向。

dmPaperLength 重定义由dmPaperSize成员指定的纸张长度,可用于自定义纸张大小,也可以用于点阵打印机,这种打印机能打出任意长度的纸张。这些值与这个结构中其他指定物理长度的值都是以0.1毫米为单位的。

dmPaperWidth 重载由dmPaperSize成员指定的纸张宽度。

dmScale 指定了打印输出的缩放因子。实际的页面大小为物理纸张的大小乘以dmScale/100。例如,对于信纸大小的纸张,如果dmScale的值为50,它将可以容纳相当于17×22英寸页面的内容,因为输出的文本和图形的宽、高都将是原始大小的一半。

dmCopies 如果设备支持多页拷贝,则选择了要打印的拷贝数目。
dmDefaultSource 保留,必须为0。
dmPrintQuality 指定了打印机的分辨率。有四种预定义的与设备无关的值:
DMRES_HIGH
DMRES_MEDIUM
DMRES_LOW
DMRES_DRAFT
如果给定了一个正值,它就指定了每英寸打印的点数(DPI),因此是与设备有关的。

dmColor 对于彩色打印机,在彩色和单色之间切换。下面是可能的取值:
·DMCOLOR_COLOR
·DMCOLOR_MONOCHROME

dmDuplex 为支持双面打印的打印机选择双面打印方式。可能的取值如下:
·DMDUP_SIMPLEX
·DMDUP_HORIZONTAL
·DMDUP_VERTICAL

dmBitsPerPel 指定了显示设备的颜色分辨率,以像素的位数为单位。例如,16色使用4位,256色使用8位,而65536色使用16位。

dmPelsWidth 指定了可见设备表面的以像素为单位的宽度。

dmPelsHeight指定了可见设备表面的以像素为单位的高度。

dmDisplayFlags 指定了设备的显示模式。下面是有效的标志: · DM_GRAYSCALE 指定显示使用了无颜色设备。如果没有设置这个标志,就假定彩色模式。

· DM_INTERLACED 指定了隔行显示模式。如果没有设置这个标志,就假定非隔行模式。
dmDisplayFrequency 指定了显示设备的特定模式所使用的以赫兹为单位的频率(每秒的周期数)。

修改屏幕分辨率,我们需要设置的参数有dmBitsPerPel (指定了显示设备的颜色分辨率)、dmPelsWidth (指定了可见设备表面的以像素为单位的宽度)、dmPelsHeight(指定了可见设备表面的以像素为单位的高度)、dmSize (指定了DEVMODE结构的大小)、dmFields (指定了DEVMODE结构的其余成员中哪些已被初始化以字节为单位)。代码如下:

DEVMODE lpDevMode;
lpDevMode.dmBitsPerPel=32;
lpDevMode.dmPelsWidth=1024;
lpDevMode.dmPelsHeight=768;
lpDevMode.dmSize=sizeof(lpDevMode);
lpDevMode.dmFields =DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL;

下面介绍另一个函数ChangeDisplaySettings
msdn上是这样描述的:change the settings of the default display device to specified graphics mode.
语法:
Long ChangeDisplaySettings(_in DEVMODE *lpDevMode, _in DWORD dwflags);
参数:
lpDevMode 指向DEVMODE结构体的指针。
dwflags 表明了图形模式如何改变,具体取值可以查看msdn。
返回值:
DISP_CHANGE_SUCCESSFUL:设备改变成功。
DISP_CHANGE_RESTART:为使图形模式生效计算机必须重新启动。
DISP_CHANGE_BADFLAGS:标志的无效设置被传送。
DISP_CHANGE_NOTUPDATED:在WindowsNT中不能把设置写入注册表。
DISP_CHANGE_BADPARAM:一个无效的参数被传递。它可以包括一个无效的标志或标志的组合。
DISP_CHANGE_FAILED:指定图形模式的显示驱动失效。
DISP_CHANGE_BADMODE:不支持图形模式。

有了以上基础知识,下面开始我们的程序编写。
首先新建一个win32项目,添加一个.cpp文件,键入代码:

#include<Windows.h>
int CALLBACK WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{//获取分辨率int m_nWindwMetricsX = ::GetSystemMetrics(SM_CXSCREEN);int m_nWindwMetricsY = ::GetSystemMetrics(SM_CYSCREEN);char charX[20];itoa(m_nWindwMetricsX, charX, 10);MessageBox(NULL, charX, "分辨率",MB_OK);//修改分辨率DEVMODE lpDevMode;lpDevMode.dmBitsPerPel=32;lpDevMode.dmPelsWidth=1024;lpDevMode.dmPelsHeight=768;lpDevMode.dmSize=sizeof(lpDevMode);lpDevMode.dmFields =DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL;LONG result;result=ChangeDisplaySettings(&lpDevMode,0);if (result==DISP_CHANGE_SUCCESSFUL){MessageBox(NULL,"修改成功!", "修改", MB_OK);ChangeDisplaySettings(&lpDevMode,CDS_UPDATEREGISTRY);//   //使用CDS_UPDATEREGISTRY表示次修改是持久的,//   //并在注册表中写入了相关的数据}else{MessageBox(NULL, "修改失败,恢复原有设置!", "修改", MB_OK);ChangeDisplaySettings(NULL,0);}return 0;
}

win32项目--获取、修改计算机屏幕分辨率相关推荐

  1. mfc改计算机名称,VC获取并修改计算机屏幕分辨率(MFC)

    //检测当前分辨率 int Width = GetSystemMetrics(SM_CXSCREEN); int Height = GetSystemMetrics(SM_CYSCREEN); DEV ...

  2. mfc获取别的计算机是否在线,VC获取并修改计算机屏幕分辨率(MFC)

    //检测当前分辨率 int Width = GetSystemMetrics(SM_CXSCREEN); int Height = GetSystemMetrics(SM_CYSCREEN); DEV ...

  3. centos8调整分辨率_centos 7 修改系统屏幕分辨率

    centos 7 修改系统屏幕分辨率,命令方式和图形方式的修改方法.命令:xrandr 通过命令 xrandr 修改系统的分辨率,输入xrandr:[admin@localhost ~]$ xrand ...

  4. adb 查看屏幕大小_Android应用开发之adb命令如何获取android手机屏幕分辨率

    本文将带你了解Android应用开发之adb命令如何获取android手机屏幕分辨率,希望本文对大家学Android有所帮助 #### 1.   通用方法: adb shell dumpsys win ...

  5. js获取操作系统以及屏幕分辨率

    嗨害嗨,好久不见,我又来了奥.今天有人问了一个这样的问题,就是如何获取屏幕的分辨率,还有操作系统.因为他做的项目接口需要传的参数中包括这两样.我搜索了并且整理了一下. 获取操作系统的话,bom有一个对 ...

  6. 为什么计算机屏幕分辨率会,为什么计算机屏幕变窄

    我的电脑屏幕变窄了. 首先,系统解析问题 如果这是第一个分辨率问题,我们只需增加分辨率即可全屏显示. 首先在桌面上的空白处单击,然后单击鼠标右键,单击屏幕分辨率设置,调整最佳屏幕分辨率,然后确定. 第 ...

  7. JS获取客户端信息(屏幕分辨率、浏览器版本、操作系统版本)

    废话就不多说了,直接上JS代码,如下: /*** 获取浏览器版本* @returns*/ function getBrowserInfo(){var agent = navigator.userAge ...

  8. 如何更改计算机屏幕分辨率,屏幕分辨率调改不了怎么办

    分辨率怎么调?也许有朋友说,如此简单的问题还用说吗,今天讨论是分辨率的多种调整方法,以及无法调整分辨率以及调整分辨率出现的问题,希望对新手朋友有所帮助. 分辨率怎么调 -介绍调不了3种解决方法 方法1 ...

  9. 某计算机屏幕的分辨率,计算机屏幕分辨率[Illustration]

    计算机是大多数人都熟悉的电子产品. 正是由于它的外表,我们的生活发生了翻天覆地的变化. 我们可以使用计算机来做很多事情,例如学习,工作和办公室,看电影,娱乐等等. 随着与计算机的接触时间越来越长,我们 ...

  10. 为什么计算机屏幕分辨率会,屏幕分辨率为什么调不了【解决方法】

    我们都知道,电脑的运用如今在我们的生活中已经非常得普遍而且广泛了,它被广泛地运用在学习.工作.科学以及技术上.但是在平时使用电脑的过程中可能会有很多的问题.对于电脑新手来说,最常遇见的问题之一便是有时 ...

最新文章

  1. Java基础篇:异常处理
  2. 为什么我建议你现在学Vue3?
  3. 程序员都怎么过端午节?
  4. 试试这个Excel知识测验,得分超过80分算你赢
  5. 在Nginx上配置NameCheap免费SSL
  6. SpringBoot集成RabbitMQ消息队列搭建与ACK消息确认入门
  7. python怎么和数据库连接_Java和Python都怎么连接数据库
  8. linux/ubuntu中制作deb安装包
  9. 如何在不接收返回值的情况下获取返回值?
  10. 【ArcGIS|空间分析】微博签到数据分析(全国大学生GIS技能大赛试题)
  11. Error while executing: am start -n错误解决方案
  12. java初学者,应该怎么去学习?
  13. jmeter的HTTP请求
  14. 使用torch.nn.BatchNorm1d出现Tensor for argument #2 ‘weight‘ is on CPU, but expected it to on GPU错误
  15. 两种有趣的排序方法:睡眠排序、猴子排序(golang版本)
  16. yii2授权之ACF
  17. 霸气女创始人刘楠:我挖了迪士尼高管,2年把公司干到100亿!
  18. OSSIM开源安全信息管理系统(十七)
  19. uni-app微信小程序微信登录(获取头像、个性签名等基本信息)
  20. Java多线程 - Runnable接口和Callable接口的区别

热门文章

  1. 彻底解决pycharm中用matplotlib表格绘制时图表中汉字设置
  2. python用tkinter做简易计算器_基于python tkinter的简单计算器(v1.0)
  3. 在linux系统中使用shc指令,Linux编译安装SHC加密组件
  4. 【系统分析师之路】第二十一章 复盘系分专业英语
  5. 电信屏蔽了80端口,利用80端口映射解决web网站应用发布问题
  6. 用计算机弹苹果手机铃声,苹果手机如何设置铃声
  7. python编写程序计算梯形面积公式_肿么用c语言编写程序梯形面积
  8. WIN10+ubuntu16.04双系统卸载重装
  9. 一图看懂编程语言分类
  10. windows下搭建自己的跨平台tts语音合成播报技术