今天介绍一下,windows客户端开发中,屏幕分辨率,以及屏幕客户区大小的获得方法。
GetSystemMetrics
函数功能:用于得到被定义的系统数据或者系统配置信息
函数原型:
int WINAPIGetSystemMetrics(int nIndex);
nIndex可取值:
#define SM_CXSCREEN 0
#define SM_CYSCREEN 1
#define SM_CXVSCROLL 2
#define SM_CYHSCROLL 3
#define SM_CYCAPTION 4
#define SM_CXBORDER 5
#define SM_CYBORDER 6
#define SM_CXDLGFRAME 7
#define SM_CYDLGFRAME 8
#define SM_CYVTHUMB 9
#define SM_CXHTHUMB 10
#define SM_CXICON 11
#define SM_CYICON 12
#define SM_CXCURSOR 13
#define SM_CYCURSOR 14
#define SM_CYMENU 15
#define SM_CXFULLSCREEN 16
#define SM_CYFULLSCREEN 17
#define SM_CYKANJIWINDOW 18
#define SM_MOUSEPRESENT 19
#define SM_CYVSCROLL 20
#define SM_CXHSCROLL 21
#define SM_DEBUG 22
#define SM_SWAPBUTTON 23
#define SM_RESERVED1 24
#define SM_RESERVED2 25
#define SM_RESERVED3 26
#define SM_RESERVED4 27
#define SM_CXMIN 28
#define SM_CYMIN 29
#define SM_CXSIZE 30
#define SM_CYSIZE 31
#define SM_CXFRAME 32
#define SM_CYFRAME 33
#define SM_CXMINTRACK 34
#define SM_CYMINTRACK 35
#define SM_CXDOUBLECLK 36
#define SM_CYDOUBLECLK 37
#define SM_CXICONSPACING 38
#define SM_CYICONSPACING 39
#define SM_MENUDROPALIGNMENT 40
#define SM_PENWINDOWS 41
#define SM_DBCSENABLED 42
#define SM_CMOUSEBUTTONS 43
#if(WINVER >= 0x0400)
#define SM_CXFIXEDFRAME SM_CXDLGFRAME /* ;win40 name change */
#define SM_CYFIXEDFRAME SM_CYDLGFRAME /* ;win40 name change */
#define SM_CXSIZEFRAME SM_CXFRAME /* ;win40 name change */
#define SM_CYSIZEFRAME SM_CYFRAME /* ;win40 name change */
#define SM_SECURE 44
#define SM_CXEDGE 45
#define SM_CYEDGE 46
#define SM_CXMINSPACING 47
#define SM_CYMINSPACING 48
#define SM_CXSMICON 49
#define SM_CYSMICON 50
#define SM_CYSMCAPTION 51
#define SM_CXSMSIZE 52
#define SM_CYSMSIZE 53
#define SM_CXMENUSIZE 54
#define SM_CYMENUSIZE 55
#define SM_ARRANGE 56
#define SM_CXMINIMIZED 57
#define SM_CYMINIMIZED 58
#define SM_CXMAXTRACK 59
#define SM_CYMAXTRACK 60
#define SM_CXMAXIMIZED 61
#define SM_CYMAXIMIZED 62
#define SM_NETWORK 63
#define SM_CLEANBOOT 67
#define SM_CXDRAG 68
#define SM_CYDRAG 69
#endif /* WINVER >= 0x0400 */
#define SM_SHOWSOUNDS 70
#if(WINVER >= 0x0400)
#define SM_CXMENUCHECK 71 /* Use instead of GetMenuCheckMarkDimensions()! */
#define SM_CYMENUCHECK 72
#define SM_SLOWMACHINE 73
#define SM_MIDEASTENABLED 74
#endif /* WINVER >= 0x0400 */
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
#define SM_MOUSEWHEELPRESENT 75
#endif
#if(WINVER >= 0x0500)
#define SM_XVIRTUALSCREEN 76
#define SM_YVIRTUALSCREEN 77
#define SM_CXVIRTUALSCREEN 78
#define SM_CYVIRTUALSCREEN 79
#define SM_CMONITORS 80
#define SM_SAMEDISPLAYFORMAT 81
#endif /* WINVER >= 0x0500 */
#if (WINVER < 0x0500) && (!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0400))
#define SM_CMETRICS 76
#else
#define SM_CMETRICS 83
#endif
GetDeviceCaps
函数功能:获取指定设备的性能参数该方法将所取得的硬件设备信息保存到一个D3DCAPS9结构中。
函数原型:
int GetDeviceCaps(HDC hdc, int nlndex);
EnumDisplaySettings
EnumDisplaySettings函数得到显示设备的一个图形模式设备,通过对该函数一系列的调用可以得到显示设备所有的图形模式信息。
BOOL EnumDisplaySettings(LPCTSTR lpszDeviceName, DWORD iModeNum, LPDEVMODE lpDevMode);
SystemParametersinfo
该函数查询或设置系统级参数。该函数也可以在设置参数中更新用户配置文件。
BOOL SystemParametersinfo(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinlni);
应用:
#include <stdio.h>
#include <windows.h>
#include <iostream>
int main()
{
int nScreenWidth, nScreenHeight;
nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
printf("屏幕大小(像素) 宽:%d 高:%d\n", nScreenWidth, nScreenHeight);
//HWND pTaskWnd = FindWindow(L"Shell_TrayWnd", NULL);
//ShowWindow(pTaskWnd, true);
//LONG lStyle = GetWindowLong(pTaskWnd, GWL_STYLE);
//if (lStyle & WS_VISIBLE)
//{
// //可见
//}
//else
//{
// //隐藏
//}
HDC hdcScreen = GetDC(NULL);
int cx = GetDeviceCaps(hdcScreen, HORZRES);
int cy = GetDeviceCaps(hdcScreen, VERTRES);
DeleteObject(hdcScreen);
printf("屏幕大小 宽:%d 高:%d\n", cx, cy);
RECT rc;
SystemParametersInfo(SPI_GETWORKAREA, 0, (PVOID)&rc, 0);
printf("客户区大小(像素) 宽:%d 高:%d\n", rc.right - rc.left, rc.bottom - rc.top);
int nClientWidth, nClientHeight;
nClientWidth = GetSystemMetrics(SM_CXFULLSCREEN);
nClientHeight = GetSystemMetrics(SM_CYFULLSCREEN);
printf("客户区大小(像素) 宽:%d 高:%d\n", nClientWidth, nClientHeight);
int nMaximizedWidth, nMaximizedHeight;
nMaximizedWidth = GetSystemMetrics(SM_CXMAXIMIZED);
nMaximizedHeight = GetSystemMetrics(SM_CYMAXIMIZED);
printf("最大化窗口的默认尺寸(像素) 宽:%d 高:%d\n", nMaximizedWidth, nMaximizedHeight);
DEVMODE dm;
dm.dmSize = sizeof(DEVMODE);
dm.dmDriverExtra = 0;
if (!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm))
{
std::cout << "枚举失败" << std::endl;
}
else
{
std::cout << "===============START=====================" << std::endl;
std::cout << "dmCollate===" << dm.dmCollate << std::endl;
std::cout << "dmBitsPerPel===" << dm.dmBitsPerPel << std::endl;
std::cout << "dmColor===" << dm.dmColor << std::endl;
std::cout << "dmDeviceName===" << dm.dmDeviceName << std::endl;
std::cout << "dmDisplayFlags===" << dm.dmDisplayFlags << std::endl;
std::cout << "dmDisplayFrequency===" << dm.dmDisplayFrequency << std::endl;
std::cout << "dmDitherType===" << dm.dmDitherType << std::endl;
std::cout << "dmDriverExtra===" << dm.dmDriverExtra << std::endl;
std::cout << "dmDriverVersion===" << dm.dmDriverVersion << std::endl;
std::cout << "dmDuplex===" << dm.dmDuplex << std::endl;
std::cout << "dmFields===" << dm.dmFields << std::endl;
std::cout << "dmFormName===" << dm.dmFormName << std::endl;
std::cout << "dmICMIntent===" << dm.dmICMIntent << std::endl;
std::cout << "dmICMMethod===" << dm.dmICMMethod << std::endl;
std::cout << "dmLogPixels===" << dm.dmLogPixels << std::endl;
std::cout << "dmMediaType===" << dm.dmMediaType << std::endl;
std::cout << "dmNup===" << dm.dmNup << std::endl;
std::cout << "dmPanningHeight===" << dm.dmPanningHeight << std::endl;
std::cout << "dmPanningWidth===" << dm.dmPanningWidth << std::endl;
std::cout << "dmPelsHeight===" << dm.dmPelsHeight << std::endl;
std::cout << "dmPelsWidth===" << dm.dmPelsWidth << std::endl;
std::cout << "dmReserved1===" << dm.dmReserved1 << std::endl;
std::cout << "dmReserved2===" << dm.dmReserved2 << std::endl;
std::cout << "dmSize===" << dm.dmSize << std::endl;
std::cout << "dmSpecVersion===" << dm.dmSpecVersion << std::endl;
std::cout << "dmTTOption===" << dm.dmTTOption << std::endl;
std::cout << "dmYResolution===" << dm.dmYResolution << std::endl;
std::cout << "=================END=============================" << std::endl;
}
system("pause");
return 0;
}
输出结果:
屏幕大小(像素) 宽:1920 高:1080
屏幕大小 宽:1920 高:1080
客户区大小(像素) 宽:1920 高:1040
客户区大小(像素) 宽:1920 高:1017
最大化窗口的默认尺寸(像素) 宽:1936 高:1056
===============START=====================
dmCollate===0
dmBitsPerPel===32
dmColor===0
dmDeviceName===00B3FA2C
dmDisplayFlags===0
dmDisplayFrequency===60
dmDitherType===3435973836
dmDriverExtra===0
dmDriverVersion===1025
dmDuplex===0
dmFields===544997536
dmFormName===00B3FA92
dmICMIntent===3435973836
dmICMMethod===3435973836
dmLogPixels===96
dmMediaType===3435973836
dmNup===0
dmPanningHeight===3435973836
dmPanningWidth===3435973836
dmPelsHeight===1080
dmPelsWidth===1920
dmReserved1===3435973836
dmReserved2===3435973836
dmSize===188
dmSpecVersion===1025
dmTTOption===0
dmYResolution===0
=================END=============================
上述代码中,有获得任务栏高度的相关代码!!!