#pragma once
/*-----------------------------------------------
SYSMETS.H -- System metrics display structure
-----------------------------------------------*/
#include <tchar.h>
#include <Windows.h>
#define NUMLINES ((int)(sizeof sysmetrics / sizeof sysmetrics[0]))
struct{
int iIndex;
TCHAR* szLabel;
TCHAR* szDesc;
}
sysmetrics[] =
{
SM_CXSCREEN,TEXT("SM_CXSCREEN"),
TEXT("Screenwidthinpixels"),
SM_CYSCREEN,TEXT("SM_CYSCREEN"),
TEXT("Screenheightinpixels"),
SM_CXVSCROLL,TEXT("SM_CXVSCROLL"),
TEXT("Verticalscrollwidth"),
SM_CYHSCROLL,TEXT("SM_CYHSCROLL"),
TEXT("Horizontalscrollheight"),
SM_CYCAPTION,TEXT("SM_CYCAPTION"),
TEXT("Captionbarheight"),
SM_CXBORDER,TEXT("SM_CXBORDER"),
TEXT("Windowborderwidth"),
SM_CYBORDER,TEXT("SM_CYBORDER"),
TEXT("Windowborderheight"),
SM_CXFIXEDFRAME,TEXT("SM_CXFIXEDFRAME"),
TEXT("Dialogwindowframewidth"),
SM_CYFIXEDFRAME,TEXT("SM_CYFIXEDFRAME"),
TEXT("Dialogwindowframeheight"),
SM_CYVTHUMB,TEXT("SM_CYVTHUMB"),
TEXT("Verticalscrollthumbheight"),
SM_CXHTHUMB,TEXT("SM_CXHTHUMB"),
TEXT("Horizontalscrollthumbwidth"),
SM_CXICON,TEXT("SM_CXICON"),
TEXT("Iconwidth"),
SM_CYICON,TEXT("SM_CYICON"),
TEXT("Iconheight"),
SM_CXCURSOR,TEXT("SM_CXCURSOR"),
TEXT("Cursorwidth"),
SM_CYCURSOR,TEXT("SM_CYCURSOR"),
TEXT("Cursorheight"),
SM_CYMENU,TEXT("SM_CYMENU"),
TEXT("Menubarheight"),
SM_CXFULLSCREEN,TEXT("SM_CXFULLSCREEN"),
TEXT("Fullscreenclientareawidth"),
SM_CYFULLSCREEN,TEXT("SM_CYFULLSCREEN"),
TEXT("Fullscreenclientareaheight"),
SM_CYKANJIWINDOW,TEXT("SM_CYKANJIWINDOW"),
TEXT("Kanjiwindowheight"),
SM_MOUSEPRESENT,TEXT("SM_MOUSEPRESENT"),
TEXT("Mousepresentflag"),
SM_CYVSCROLL,TEXT("SM_CYVSCROLL"),
TEXT("Verticalscrollarrowheight"),
SM_CXHSCROLL,TEXT("SM_CXHSCROLL"),
TEXT("Horizontalscrollarrowwidth"),
SM_DEBUG,TEXT("SM_DEBUG"),
TEXT("Debugversionflag"),
SM_SWAPBUTTON,TEXT("SM_SWAPBUTTON"),
TEXT("Mousebuttonsswappedflag"),
SM_CXMIN,TEXT("SM_CXMIN"),
TEXT("Minimumwindowwidth"),
SM_CYMIN,TEXT("SM_CYMIN"),
TEXT("Minimumwindowheight"),
SM_CXSIZE,TEXT("SM_CXSIZE"),
TEXT("Min/Max/Closebuttonwidth"),
SM_CYSIZE,TEXT("SM_CYSIZE"),
TEXT("Min/Max/Closebuttonheight"),
SM_CXSIZEFRAME,TEXT("SM_CXSIZEFRAME"),
TEXT("Windowsizingframewidth"),
SM_CYSIZEFRAME,TEXT("SM_CYSIZEFRAME"),
TEXT("Windowsizingframeheight"),
SM_CXMINTRACK,TEXT("SM_CXMINTRACK"),
TEXT("Minimumwindowtrackingwidth"),
SM_CYMINTRACK,TEXT("SM_CYMINTRACK"),
TEXT("Minimumwindowtrackingheight"),
SM_CXDOUBLECLK,TEXT("SM_CXDOUBLECLK"),
TEXT("Doubleclickxtolerance"),
SM_CYDOUBLECLK,TEXT("SM_CYDOUBLECLK"),
TEXT("Doubleclickytolerance"),
SM_CXICONSPACING,TEXT("SM_CXICONSPACING"),
TEXT("Horizontaliconspacing"),
SM_CYICONSPACING,TEXT("SM_CYICONSPACING"),
TEXT("Verticaliconspacing"),
SM_MENUDROPALIGNMENT,TEXT("SM_MENUDROPALIGNMENT"),
TEXT("Leftorrightmenudrop"),
SM_PENWINDOWS,TEXT("SM_PENWINDOWS"),
TEXT("Penextensionsinstalled"),
SM_DBCSENABLED,TEXT("SM_DBCSENABLED"),
TEXT("Double-ByteCharSetenabled"),
SM_CMOUSEBUTTONS,TEXT("SM_CMOUSEBUTTONS"),
TEXT("Numberofmousebuttons"),
SM_SECURE,TEXT("SM_SECURE"),
TEXT("Securitypresentflag"),
SM_CXEDGE,TEXT("SM_CXEDGE"),
TEXT("3-Dborderwidth"),
SM_CYEDGE,TEXT("SM_CYEDGE"),
TEXT("3-Dborderheight"),
SM_CXMINSPACING,TEXT("SM_CXMINSPACING"),
TEXT("Minimizedwindowspacingwidth"),
SM_CYMINSPACING,TEXT("SM_CYMINSPACING"),
TEXT("Minimizedwindowspacingheight"),
SM_CXSMICON,TEXT("SM_CXSMICON"),
TEXT("Smalliconwidth"),
SM_CYSMICON,TEXT("SM_CYSMICON"),
TEXT("Smalliconheight"),
SM_CYSMCAPTION,TEXT("SM_CYSMCAPTION"),
TEXT("Smallcaptionheight"),
SM_CXSMSIZE,TEXT("SM_CXSMSIZE"),
TEXT("Smallcaptionbuttonwidth"),
SM_CYSMSIZE,TEXT("SM_CYSMSIZE"),
TEXT("Smallcaptionbuttonheight"),
SM_CXMENUSIZE,TEXT("SM_CXMENUSIZE"),
TEXT("Menubarbuttonwidth"),
SM_CYMENUSIZE,TEXT("SM_CYMENUSIZE"),
TEXT("Menubarbuttonheight"),
SM_ARRANGE,TEXT("SM_ARRANGE"),
TEXT("Howminimizedwindowsarranged"),
SM_CXMINIMIZED,TEXT("SM_CXMINIMIZED"),
TEXT("Minimizedwindowwidth"),
SM_CYMINIMIZED,TEXT("SM_CYMINIMIZED"),
TEXT("Minimizedwindowheight"),
SM_CXMAXTRACK,TEXT("SM_CXMAXTRACK"),
TEXT("Maximumdraggablewidth"),
SM_CYMAXTRACK,TEXT("SM_CYMAXTRACK"),
TEXT("Maximumdraggableheight"),
SM_CXMAXIMIZED,TEXT("SM_CXMAXIMIZED"),
TEXT("Widthofmaximizedwindow"),
SM_CYMAXIMIZED,TEXT("SM_CYMAXIMIZED"),
TEXT("Heightofmaximizedwindow"),
SM_NETWORK,TEXT("SM_NETWORK"),
TEXT("Networkpresentflag"),
SM_CLEANBOOT,TEXT("SM_CLEANBOOT"),
TEXT("Howsystemwasbooted"),
SM_CXDRAG,TEXT("SM_CXDRAG"),
TEXT("Avoiddragxtolerance"),
SM_CYDRAG,TEXT("SM_CYDRAG"),
TEXT("Avoiddragytolerance"),
SM_SHOWSOUNDS,TEXT("SM_SHOWSOUNDS"),
TEXT("Presentsoundsvisually"),
SM_CXMENUCHECK,TEXT("SM_CXMENUCHECK"),
TEXT("Menucheck-markwidth"),
SM_CYMENUCHECK,TEXT("SM_CYMENUCHECK"),
TEXT("Menucheck-markheight"),
SM_SLOWMACHINE,TEXT("SM_SLOWMACHINE"),
TEXT("Slowprocessorflag"),
SM_MIDEASTENABLED,TEXT("SM_MIDEASTENABLED"),
TEXT("HebrewandArabicenabledflag"),
SM_MOUSEWHEELPRESENT,TEXT("SM_MOUSEWHEELPRESENT"),
TEXT("Mousewheelpresentflag"),
SM_XVIRTUALSCREEN,TEXT("SM_XVIRTUALSCREEN"),
TEXT("Virtualscreenxorigin"),
SM_YVIRTUALSCREEN,TEXT("SM_YVIRTUALSCREEN"),
TEXT("Virtualscreenyorigin"),
SM_CXVIRTUALSCREEN,TEXT("SM_CXVIRTUALSCREEN"),
TEXT("Virtualscreenwidth"),
SM_CYVIRTUALSCREEN,TEXT("SM_CYVIRTUALSCREEN"),
TEXT("Virtualscreenheight"),
SM_CMONITORS,TEXT("SM_CMONITORS"),
TEXT("Numberofmonitors"),
SM_SAMEDISPLAYFORMAT,TEXT("SM_SAMEDISPLAYFORMAT"),
TEXT("Samecolorformatflag")
};
#include <windows.h>
#include "sysmets.h"
typedef WNDPROC WMPROC;
typedef struct{
UINT msg;
WMPROC wmProc;
}MsgWithProc;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT __stdcall WMcreate(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT __stdcall WMpaint(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT __stdcall WMdestory(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
static int cxChar, cxCaps, cyChar;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow){
static TCHAR szAppName[] = TEXT("SysMets1");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if(!RegisterClass(&wndclass)){
MessageBox(NULL, TEXT("This program requires Windows NT!"),
szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName, TEXT("Get System Metrics No. 1"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
MsgWithProc msgWithProc[] = {
{WM_CREATE,WMcreate},
{WM_PAINT,WMpaint},
{WM_DESTROY,WMdestory}
};
for(MsgWithProc mwp : msgWithProc){
if(mwp.msg == message){
return mwp.wmProc(hwnd, message, wParam, lParam);
}
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
LRESULT __stdcall WMcreate(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
HDC hdc;
TEXTMETRIC tm;
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth;
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
cyChar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC(hwnd, hdc);
return 0;
}
LRESULT __stdcall WMpaint(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
int i;
HDC hdc;
PAINTSTRUCT ps;
TCHAR szBuffer[10];
hdc = BeginPaint(hwnd, &ps);
for(i = 0; i < NUMLINES; i++){
TextOut(hdc, 0, cyChar * i,
sysmetrics[i].szLabel,
lstrlen(sysmetrics[i].szLabel));
TextOut(hdc, 22 * cxCaps, cyChar * i,
sysmetrics[i].szDesc,
lstrlen(sysmetrics[i].szDesc));
SetTextAlign(hdc, TA_RIGHT | TA_TOP);
TextOut(hdc, 22 * cxCaps + 40 * cxChar, cyChar * i, szBuffer,
wsprintf(szBuffer, TEXT("%5d"),
GetSystemMetrics(sysmetrics[i].iIndex)));
SetTextAlign(hdc, TA_LEFT | TA_TOP);
}
EndPaint(hwnd, &ps);
return 0;
}
LRESULT __stdcall WMdestory(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
PostQuitMessage(0);
return 0;
}