#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc;
PAINTSTRUCT ps;
TCHAR str[128];
RECT rect;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd , &ps);
GetClientRect(hwnd , &rect);
wsprintf(str , "マウスボタンの数 : %d\nカーソルの横幅 : %d\nカーソルの縦幅 : %d" ,
GetSystemMetrics(SM_CMOUSEBUTTONS) ,
GetSystemMetrics(SM_CXCURSOR) ,
GetSystemMetrics(SM_CYCURSOR)
);
DrawText(hdc , str , -1 , &rect , DT_LEFT);
EndPaint(hwnd , &ps);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL , hInstance , NULL
);
if (hwnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
return msg.wParam;
}

typedef struct _SYSTEM_INFO { // sinf
union {
DWORD dwOemId;
struct {
WORD wProcessorArchitecture;
WORD wReserved;
};
};
DWORD dwPageSize;
LPVOID lpMinimumApplicationAddress;
LPVOID lpMaximumApplicationAddress;
DWORD dwActiveProcessorMask;
DWORD dwNumberOfProcessors;
DWORD dwProcessorType;
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
} SYSTEM_INFO;
dwPageSize には、各メモリページのサイズを表していますtypedef struct _OSVERSIONINFO{
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformId;
TCHAR szCSDVersion[ 128 ];
} OSVERSIONINFO;
dwOSVersionInfoSize には、この構造体のサイズを指定します| 定数 | OS |
|---|---|
| VER_PLATFORM_WIN32s | Windows 3.1 の Win32s |
| VER_PLATFORM_WIN32_WINDOWS | dwMinorVersion が 0 であれば Windows 95 0 以上であれば Windows98 |
| VER_PLATFORM_WIN32_NT | Windows NT |
| VER_PLATFORM_WIN32_CE | Windows CE |
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
static TCHAR *strVer , strText[256];
static OSVERSIONINFO osInfo;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
osInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
GetVersionEx(&osInfo);
if (osInfo.dwPlatformId == VER_PLATFORM_WIN32s)
strVer = TEXT("3.1");
else if (osInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
if (osInfo.dwMinorVersion)
strVer = TEXT("98");
else strVer = TEXT("95");
}
else strVer = TEXT("NT");
wsprintf(strText , TEXT("OS = Windows %s\nVersion = %d.%d") ,
strVer , osInfo.dwMajorVersion , osInfo.dwMinorVersion);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd , &ps);
GetClientRect(hwnd , &rect);
DrawText(hdc , strText , -1 , &rect , DT_LEFT);
EndPaint(hwnd , &ps);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL , hInstance , NULL
);
if (hwnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
return msg.wParam;
}
このプログラムは、ウィンドウに OS の種類とバージョンを表示します| 定数 | 解説 |
|---|---|
| SM_ARRANGE | 最小化ウィンドウの配置方法を示す値を取得します |
| SM_CLEANBOOT | システムがどのように起動されたかを示す値を取得します 次の値のいずれかになります 0 = 通常のブート 1 = 「 Safe モード」でのブート 2 = 「ネットワークを使った Safe モード」でのブート |
| SM_CMOUSEBUTTONS | マウスボタンの数 (マウスがないときは 0) を取得します |
|
SM_CXBORDER, SM_CYBORDER | 非立体的なウィンドウの縁の幅と高さを取得します SM_CXEDGE と SM_CYEDGE も参照 |
|
SM_CXCURSOR, SM_CYCURSOR | マウスカーソルのサイズを取得します |
|
SM_CXDLGFRAME, SM_CYDLGFRAME | SM_CXFIXEDFRAME, SM_CYFIXEDFRAME と同じ |
|
SM_CXDOUBLECLK, SM_CYDOUBLECLK | ダブルクリックにおける 2 回目の クリック位置の許容範囲を取得します 1 回目のクリックの後、許容範囲内かつ 許容時間内にもう一度マウスをクリックすると ダブルクリックが行れたものとみなされます |
|
SM_CXDRAG, SM_CYDRAG | ドラッグ操作の開始とはみなされない範囲を取得します マウスボタンを押した後、この範囲を越えてマウスを動かすと ドラッグ操作が開始されたものとみなされます |
|
SM_CXEDGE, SM_CYEDGE | 立体的なウィンドウの縁の幅と高さを取得します SM_CXBORDER と SM_CYBORDER の 3D 版です |
|
SM_CXFIXEDFRAME, SM_CYFIXEDFRAME | タイトルバーを持ち、かつ サイズが変更できないウィンドウにおける 枠の幅と高さを取得します SM_CXDLGFRAME, SM_CYDLGFRAME と同じ |
|
SM_CXFRAME, SM_CYFRAME | SM_CXSIZEFRAME, SM_CYSIZEFRAME と同じ |
|
SM_CXFULLSCREEN, SM_CYFULLSCREEN | 最大化されたウィンドウのクライアント領域のサイズを取得します |
|
SM_CXHSCROLL, SM_CYHSCROLL | 水平スクロールバーの矢印の幅 または、水平スクロールバーの高さを取得します |
| SM_CXHTHUMB | 水平スクロールバーのつまみの幅を取得します |
|
SM_CXICON, SM_CYICON | アイコンのデフォルトのサイズを取得します 通常は 32×32 ピクセルです |
|
SM_CXICONSPACING, SM_CYICONSPACING | アイコンを整列するときに使われるグリッドのサイズを取得します 常に、SM_CXICON, SM_CYICON 以上になります |
|
SM_CXMAXIMIZED, SM_CYMAXIMIZED | 最大化されたウィンドウのサイズを取得します |
|
SM_CXMAXTRACK, SM_CYMAXTRACK | ウィンドウの最大トラッキングサイズを取得します このサイズよりも大きくウィンドウの枠をドラッグすることはできません アプリケーションで WM_GETMINMAXINFO メッセージを処理すると 最大トラッキングサイズが変更できます |
|
SM_CXMENUCHECK, SM_CYMENUCHECK | メニューのチェックマークのサイズを取得します |
|
SM_CXMENUSIZE, SM_CYMENUSIZE | メニューバーに表示されるボタンのサイズを取得します |
|
SM_CXMIN, SM_CYMIN | ウィンドウの最小サイズを取得します |
|
SM_CXMINIMIZED, SM_CYMINIMIZED | 最小化されたウィンドウのデフォルトのサイズを取得します |
|
SM_CXMINSPACING, SM_CYMINSPACING | 最小化されたウィンドウの配置に使われる グリッドのサイズを取得します 常に、SM_CXMINIMIZED, SM_CYMINIMIZED 以上になります |
|
SM_CXMINTRACK, SM_CYMINTRACK | ウィンドウの最小トラッキングサイズを取得します このサイズよりも小さくウィンドウの枠をドラッグすることはできません アプリケーションで WM_GETMINMAXINFO メッセージを処理すると 最小トラッキングサイズが変更できます |
|
SM_CXSCREEN, SM_CYSCREEN | 画面全体のサイズを取得します |
|
SM_CXSIZE, SM_CYSIZE | ウィンドウのタイトルバー内のボタンのサイズを取得します |
|
SM_CXSIZEFRAME, SM_CYSIZEFRAME | サイズが変更できるウィンドウにおける枠の幅と高さを取得します SM_CXFRAME, SM_CYFRAME と同じ |
|
SM_CXSMICON, SM_CYSMICON | 小さいアイコンの推奨サイズを取得します |
|
SM_CXSMSIZE, SM_CYSMSIZE | 小さいタイトルバー内のボタンのサイズを取得します |
|
SM_CXVSCROLL, SM_CYVSCROLL | 垂直スクロールバーの幅 または、垂直スクロールバーの矢印の高さを取得します |
| SM_CYCAPTION | タイトルバーの高さを取得します |
| SM_CYKANJIWINDOW | 画面下の漢字ウィンドウの高さを取得します |
| SM_CYMENU | 一行分のメニューバーの高さを取得します |
| SM_CYSMCAPTION | 小さなタイトルバーの高さを取得します |
| SM_CYVTHUMB | 垂直スクロールバーのつまみの高さを取得します |
| SM_DBCSENABLED | USER.EXE がダブルバイト文字セット (DBCS) を サポートしているかどうかを示す値を取得します サポートしているときは 0 以外の値が サポートしていないときは 0 が返ります |
| SM_DEBUG | USER.EXE がデバッグバージョンかどうかを示す値を取得します デバッグバージョンのときは 0 以外の値が デバッグバージョンでないときは 0 が返ります |
| SM_MENUDROPALIGNMENT | メニューバーの項目に対して ドロップダウンメニューが右寄せされるかどうかを示す値を取得します 右寄せされるときは 0 以外の値が 左寄せされるときは 0 が返ります |
| SM_MIDEASTENABLED | ヘブライ語やアラビア語が 利用可能なシステムかどうかを示す値を取得します 利用できるときは TRUE が返ります |
| SM_MOUSEPRESENT | マウスが接続されているかどうかを示す値を取得します 接続されているときは 0 以外の値が 接続されていないときは 0 が返ります |
| SM_MOUSEWHEELPRESENT | Windows NT ホイールを持つマウスが接続されているかどうかを示す値を取得します 接続されているときは 0 以外の値が 接続されていないときは 0 が返ります |
| SM_NETWORK | ネットワークが存在するかどうかを示す値を取得します 存在するときは最下位ビットが 1 の値が そうでないときは最下位ビットが 0 の値が返ります 最下位ビット以外のビットは予約されています |
| SM_PENWINDOWS | Window for Pen computing extensions が インストールされているかどうかを示す値を取得します インストールされているときは 0 以外の値が インストールされていないときは 0 が返ります |
| SM_SECURE | セキュリティが存在するかどうかを示す値を取得します 存在するときは TRUE が 存在しないときは FALSE が返ります |
| SM_SHOWSOUNDS | ユーザー補助の「サウンド解説を使う」が 有効になっているかどうかを調べます 有効になっているときは 0 以外の値が そうでないときは 0 が返ります |
| SM_SLOWMACHINE | コンピュータのプロセッサが遅いかどうかを示す値を取得します 遅いときは TRUE が それ以外のときは FALSE が返ります |
| SM_SWAPBUTTON | 左右のマウスボタンの機能を交換しているかどうかを示す値を取得します 交換しているときは 0 以外の値が 交換していないときは 0 が返ります |
| 定数 | 解説 |
|---|---|
| 開始位置 | |
| ARW_BOTTOMLEFT | スクリーンの左下隅 (デフォルト) |
| ARW_BOTTOMRIGHT | スクリーンの右下隅 (ARW_STARTRIGHT と同じ) |
| ARW_HIDE | 画面の外に隠す |
| ARW_TOPLEFT | スクリーンの左上隅 (ARW_STARTTOP と同じ) |
| ARW_TOPRIGHT | スクリーンの右上隅 (ARW_STARTTOP | ARW_STARTRIGHT と同じ) |
| 方向 | |
| ARW_DOWN | 上から下へ、垂直方向に配置 |
| ARW_LEFT | 左から右へ、水平方向に配置 |
| ARW_RIGHT | 右から左へ、水平方向に配置 |
| ARW_UP | 下から上へ、垂直方向に配置 |