システム情報を得る


サイズや設定を得る

前回はデバイスの情報を得る方法について説明しました
今回は、Windowsの設定やウィンドウを構成する
各要素のサイズなどを得る方法について紹介していきたいと思います

ウィンドウを構成する要素とは、タイトルバーやスクロールバーなどのサイズです
また、マウスが接続されているかどうかなどの情報も知ることができます
これらシステムの情報を得るには GetSystemMetrics() を使います

int GetSystemMetrics(int nIndex);

nIndex には、取得したい情報の定数を指定します
戻り値は、nIndex で要求した情報を返します

定数は、ページ下部のリファレンスを参照してください
次のプログラムは、マウスのボタンの数 SM_CMOUSEBUTTONS
マウスカーソルの横幅 SM_CXCURSOR と縦幅 SM_CYCURSOR を得て
それをクライアントエリアに表示するプログラムです
#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;
}


もちろんこの結果は筆者の環境のものなので
ボタンの数やカーソルのサイズは、環境によっては異なります
このほかにも、様々な興味深いデータを得ることができます

やや低水準な情報であれば GetSystemInfo() 関数を使います
プロセッサの種類やメモリ管理の情報などを取得することができますが
Windows 9x では、ほとんど用いられることはないでしょう

VOID GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);

lpSystemInfo には SYSTEM_INFO 構造体へのポインタを指定します
この構造体に、システム情報が格納されます
SYSTEM_INFO 構造体はようの様に定義されています
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 には、各メモリページのサイズを表しています
これは、仮想アドレス空間という、やや高度な分野の情報なので後記します

プロセッサの種類は dwProcessorType メンバが表しています
Windows 9x では、PROCESSOR_INTEL_386、PROCESSOR_INTEL_486
PROCESSOR_INTEL_PENTIUM のいずれかになります
NT 系であれば、MIPS プロセッサなどをサポートしているので、他のフラグもあります

dwAllocationGranularity メンバは、メモリ割り当て単位を表しています
このメンバを使って、一部のメモリに関連した関数の引数を指定することがあります

Windows 9x で用いられるメンバはこの程度です
プロセッサの種類を知りたい時などに、必要に応じて使ってください


OS のバージョンを得る

Win32 API には、NT と 9x で互換性のないものがいくつかあります
これらを使いたい時は、OS の種類をあらかじめ取得し
その結果に応じて、呼び出すべきファンクションを決定しなければなりません

OS の情報を得るには GetVersionEx() 関数を使います
この関数を用いれば、Windows の種類やバージョンを取得できます

BOOL GetVersionEx(LPOSVERSIONINFO lpVersionInformation);

lpVersionInfomation には、OSVERSIONINFO 構造体へのポインタを指定します
成功すれば 0 以外、失敗すれば 0 が返ります
OSVERSIONINFO 構造体は、次のように定義されています
typedef struct _OSVERSIONINFO{ 
    DWORD dwOSVersionInfoSize; 
    DWORD dwMajorVersion; 
    DWORD dwMinorVersion; 
    DWORD dwBuildNumber; 
    DWORD dwPlatformId; 
    TCHAR szCSDVersion[ 128 ]; 
} OSVERSIONINFO;
dwOSVersionInfoSize には、この構造体のサイズを指定します
この値だけは、GetVersionEx() に渡す前に指定しなければなりません

dwMajorVersion は、OS のメジャーバージョン dwMinorVersion には、マイナーバージョンを指定します
例えば、Windows NT 3.51 であれば、メジャーバージョンが 3
マイナーバージョンが 51 となります

dwBuildNumber は、Windows の製造ナンバーが格納されます
9x の場合は、上位ワードにメジャーとマイナーバージョンを含みます

dwPlatformId には、OS の種類を表す定数が格納されています
この定数から、次の様に Windows の種類を判定できます

定数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

szCSDVersion は、OS に関連した追加情報を表す文字列です
NT 系の場合は、インストールされている最新のサービスパックを表しています
#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 の種類とバージョンを表示します


GetSystemMetrics()

int GetSystemMetrics(int nIndex);

システム設定や画面のデザインを構成する要素のサイズを取得します
要素のサイズはピクセル単位で返されます

nIndex - 要求する値を表す定数を指定します

戻り値 - 要求した値、または定数、またはブール値。失敗すると 0

nIndex には、次のいずれかの定数を指定します
SM_CX* は横幅、SM_CY* は高さを要求します

定数解説
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 が返ります

SM_ARRANGE を指定すると、最小化ウィンドウの配置方法を示す値が返ります
配置方法は、開始位置と方向から構成されます

定数 解説
開始位置
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 下から上へ、垂直方向に配置

GetSystemInfo()

VOID GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);

システムで用いられているハードウェアの情報を取得します

lpSystemInfo - SYSTEM_INFO 構造体へのポインタを指定します

GetVersionEx()

BOOL GetVersionEx(LPOSVERSIONINFO lpVersionInformation);

実行中の OS のバージョン情報を取得します

lpVersionInfomation - OSVERSIONINFO 構造体へのポインタを指定します

戻り値 - 成功すれば 0 以外、失敗すれば 0



前のページへ戻る次のページへ