>> WINAPI入門トップに戻る

システム情報の取得

今回はシステム情報の取得について説明します。

関数はGetSystemMetrics関数を使います。

int GetSystemMetrics(
int nIndex // システムメトリックまたは現在の構成
);

引数には以下の指定された定数を使います。
※以下はMSDNより引用

SM_ARRANGE	最小化ウィンドウの配置方法を示す値を取得します。最小化ウィンドウの詳細については、この関数の「解説」を参照してください。
SM_CLEANBOOT	システムがどのように起動されたかを示す値を取得します。
    0  通常の起動
   1  「Safe モード」での起動
   2  「ネットワークを使った Safe モード」での起動
Safe モードによる起動を行うと、ユーザーのスタートアップファイルは無視されます。
SM_CMONITORS	Windows 98 と Windows 2000:デスクトップ上のモニタの数(マルチモニタ)を取得します。詳細については、この関数の「解説」を参照してください。
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 回目のクリックの後、この許容範囲内でもう一度マウスをクリックすると、ダブルクリックが行われたものと見なされます。(これら 2 回のクリックが許容時間内で発生することも必要です。)
ダブルクリックの範囲を規定する長方形の幅と高さを設定するには、SPI_SETDOUBLECLKHEIGHT と SPI_SETDOUBLECLKWIDTH の各フラグを指定して、SystemParametersInfo 関数を呼び出します。

SM_CXDRAG,
SM_CYDRAG	ドラッグ操作の開始とは見なされない範囲が既定で設定されていますが、この範囲に相当する長方形の幅と高さをピクセル単位で取得します。マウスボタンを押した後、この範囲を越えてマウスを動かすと、ドラッグ操作が開始されたものと見なされます。この結果、ユーザーは意図していない場所でドラッグ操作を開始することなく、簡単にマウスボタンをクリックし、その後放すことができます。

SM_CXEDGE,
SM_CYEDGE	立体効果付きのウィンドウの境界線の幅と高さを取得します。SM_CXBORDER と SM_CYBORDER の 3D 版です。

SM_CXFIXEDFRAME,
SM_CYFIXEDFRAME	タイトルバーがあり、サイズが変更できないウィンドウの周囲を囲む枠の幅と高さをピクセル単位で取得します。SM_CXFIXEDFRAME は垂直枠の幅、SM_CYFIXEDFRAME は水平枠の高さを表します。

SM_CXDLGFRAME および SM_CYDLGFRAME と同じことを意味します。

SM_CXFRAME,
SM_CYFRAME	SM_CXSIZEFRAME および SM_CYSIZEFRAME と同じことを意味します。

SM_CXFULLSCREEN,
SM_CYFULLSCREEN	プライマリモニタの最大化ウィンドウのクライアント領域の幅と高さを取得します。システムのタスクバーやアプリケーションのツールバーが占有する領域を除いた画面領域の座標を取得するには、SPI_GETWORKAREA を指定して SystemParametersInfo 関数を使います。

SM_CXHSCROLL,
SM_CYHSCROLL	水平スクロールバーの矢印の幅、または水平スクロールバーの高さをピクセル単位で取得します。

SM_CXHTHUMB	水平スクロールバーのスクロールボックス(つまみ)の幅をピクセル単位で取得します。
SM_CXICON,

SM_CYICON	アイコンの既定の幅と高さをピクセル単位で取得します。 関数がロードできるアイコンは、このサイズのものに限定されています。
SM_CXICONSPACING,
SM_CYICONSPACING	アイコンを整列するときに使われるグリッドのサイズをピクセル単位で取得します。整列を行うと、各アイテム(アイコン)はこのサイズの長方形の中に収容されます。これらの値は必ず、SM_CXICON および SM_CYICON 以上の大きさになります。

SM_CXMAXIMIZED,
SM_CYMAXIMIZED	プライマリモニタの最大化ウィンドウのサイズをピクセル単位で取得します。

SM_CXMAXTRACK,
SM_CYMAXTRACK	タイトルバーがあり、サイズが変更できないウィンドウの既定の最大サイズを取得します。このサイズは、デスクトップ全体に相当します。ユーザーは、このサイズを超えてウィンドウの枠をドラッグすることはできません。アプリケーション内で メッセージを処理すると、これらの値を無効にできます。

SM_CXMENUCHECK,
SM_CYMENUCHECK	メニューのチェックマークの既定のサイズをピクセル単位で取得します。

SM_CXMENUSIZE,
SM_CYMENUSIZE	マルチドキュメントインターフェイス(MDI)の子ウィンドウの「閉じる」ボタンなど、メニューバーに表示されるボタンのサイズをピクセル単位で取得します。

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	プライマリモニタの画面全体の幅と高さを取得します。これらは、(hdcPrimaryMonitor, HORZRES/VERTRES) を呼び出して取得するのと同じ値です。

SM_CXSIZE,
SM_CYSIZE	ウィンドウのタイトルバー内のボタンの幅と高さをピクセル単位で取得します。

SM_CXSIZEFRAME,
SM_CYSIZEFRAME	サイズ変更可能なウィンドウの周囲を囲む枠の幅と高さをピクセル単位で取得します。SM_CXSIZEFRAME は垂直枠の幅、SM_CYSIZEFRAME は水平枠の高さを表します。

SM_CXFRAME および SM_CYFRAME と同じことを意味します。
SM_CXSMICON,

SM_CYSMICON	小アイコンの推奨サイズをピクセル単位で取得します。小アイコンは通常、ウィンドウのタイトルバー内、および(エクスプローラなどの)小アイコンの一覧で表示されます。
SM_CXSMSIZE

SM_CYSMSIZE	タイトルバー内の小さいボタンのサイズをピクセル単位で取得します。

SM_CXVIRTUALSCREEN,
SM_CYVIRTUALSCREEN	Windows 98 と Windows 2000:仮想画面の幅と高さをピクセル単位で取得します。仮想画面とは、すべてのモニタを囲む境界長方形のことです。SM_XVIRTUALSCREEN および SM_YVIRTUALSCREEN の各値は、仮想画面の左上隅の座標を表します。

SM_CXVSCROLL,
SM_CYVSCROLL	垂直スクロールバーの幅、または垂直スクロールバーの矢印の高さをピクセル単位で取得します。

SM_CYCAPTION	通常のタイトルバーの高さをピクセル単位で取得します。
SM_CYKANJIWINDOW	ダブルバイト文字セット(DBCS)を使うシステムで、画面下の漢字ウィンドウの高さを取得します。
SM_CYMENU	1 行分のメニューバーの高さをピクセル単位で取得します。
SM_CYSMCAPTION	小さなタイトルバーの高さを取得します。
SM_CYVTHUMB	垂直スクロールバーのスクロールボックス(つまみ)の高さを取得します。
SM_DBCSENABLED	ダブルバイト文字セット(DBCS)の User.exe がインストール済みかどうかを示す値を取得します。インストール済みの場合は 0 以外の値が、インストールされていない場合は 0 が返ります。
SM_DEBUG	デバッグ版の User.exe がインストール済みかどうかを示す値を取得します。デバッグ版がインストール済みの場合は 0 以外の値(TRUE)が、デバッグ版がインストールされていない場合は 0(FALSE)が返ります。
SM_IMMENABLED	Windows 2000:IME(Input Method Manager/Input Method Editor)機能が有効になっている場合は 0 以外の値(TRUE)が返ります。無効になっている場合は 0(FALSE)が返ります。
SM_IMMENABLED は、システムが Unicode ベースのアプリケーションで、Unicode ベースの IME を使う準備ができているかどうかを示します。特定の言語に依存する IME が動作するかどうか確認するには、SM_DBCSENABLED とシステムの ANSI コードページをチェックしてください。それ以外の場合、ANSI/Unicode 間の変換が正しく実行されないことや、フォントやレジストリエントリのようなコンポーネントが存在しないことがあります。
SM_MENUDROPALIGNMENT	メニューバーの項目に対して、ドロップダウンメニューを右寄せするかどうかを示す値を取得します。右寄せする場合は 0 以外の値(TRUE)が、左寄せする場合は 0(FALSE)が返ります。
SM_MIDEASTENABLED	ヘブライ語やアラビア語(右から左へ表示)が利用可能なシステムかどうかを示す値を取得します。利用可能な場合、0 以外の値(TRUE)が返ります。
SM_MOUSEPRESENT	マウスが接続されているかどうかを示す値を取得します。接続されている場合は 0 以外の値(TRUE)が、接続されていない場合は 0(FALSE)が返ります。
SM_MOUSEWHEELPRESENT	Windows NT 4.0 以降と Windows 98:ホイール付きのマウスが接続されているかどうかを示す値を取得します。接続されている場合は 0 以外の値(TRUE)が、接続されていない場合は 0(FALSE)が返ります。
SM_NETWORK	ネットワークが存在するかどうかを示す値を取得します。存在する場合は最下位ビットが 1 の値が、存在しない場合は最下位ビットが 0 の値が返ります。他のビットは将来の使用に備えて予約されています。
SM_PENWINDOWS	Windows for Pen computing extensions がインストールされているかどうかを示す値を取得します。インストールされている場合は 0 以外の値(TRUE)が、インストールされていない場合は 0(FALSE)が返ります。
SM_REMOTESESSION	Windows NT 4.0 SP4 以降:この値は、Terminal Services 環境で使うことを意図しています。呼び出し側プロセスが Terminal Services のクライアントセッションに関連付けられている場合は 0 以外の値(TRUE)が返ります。呼び出し側プロセスが Terminal Services のコンソールセッションに関連付けられている場合 0(FALSE)が返ります。
SM_SECURE	セキュリティが存在するかどうかを示す値を取得します。存在する場合は 0 以外の値(TRUE)が、存在しない場合は 0(FALSE)が返ります。
SM_SAMEDISPLAYFORMAT	Windows 98 と Windows 2000:複数のモニタが存在する場合、すべてのモニタが同じカラーフォーマットを使っているかどうかを表す値を取得します。すべてのモニタが同じカラーフォーマットを使っている場合、0 以外の値(TRUE)が返ります。それ以外の場合、0(FALSE)が返ります。2 台のモニタが同じ色深度(ビット数)を使っていても、カラーフォーマットが異なる可能性があることに注意してください。たとえば、各ピクセルの RGB のビット数が異なっている(16 ビットの場合 RGB が 565 というのが一般的ですが、アルファブレンディング;輝度の 1 ビットを追加して ARGB1555 という組み合わせもあります)ことや、RGB の順序が異なっていることもあります。
SM_SHOWSOUNDS	ユーザー補助機能の「サウンド解説を使う」が有効になっているかどうかを調べます。有効になっている場合は 0 以外の値(TRUE)が、無効になっている場合は 0 が返ります。
SM_SLOWMACHINE	コンピュータのプロセッサが遅いかどうかを示す値を取得します。遅い場合は 0 以外の値(TRUE)が、それ以外の場合は 0(FALSE)が返ります。
SM_SWAPBUTTON	左右のマウスボタンの機能を交換しているかどうかを示す値を取得します。交換している場合は 0 以外の値(TRUE)が、交換していない場合は 0(FALSE)が返ります。



以下のコードは画面の幅と高さを取得するコードです。

#include <windows.h>
#include <stdio.h>

#define MSG(m) {\
	MessageBoxA(NULL,m,NULL,MB_OK);}

//ウィンドウハンドル
HWND hwnd;
//インスタンスハンドル
HINSTANCE hinst;

//ウィンドウ横幅
#define WIDTH 500
#define HEIGHT 300



LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
	char buf[1000];



	switch(msg){
		case WM_DESTROY:

			PostQuitMessage(0);
			return 0;

		case WM_LBUTTONDOWN:


			sprintf(buf,"幅は:%dpx、高さは:%dpxです。",GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));

			MSG(buf);
	

			return 0;

		
	}
	return DefWindowProc(hwnd,msg,wp,lp);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	MSG msg;
	WNDCLASS wc;

	wc.style=CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc=WinProc;
	wc.cbClsExtra=wc.cbWndExtra=0;
	wc.hInstance=hInstance;
	wc.hCursor=wc.hIcon=NULL;
	wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
	wc.lpszClassName="test";
	wc.lpszMenuName=NULL;
	
	if(!RegisterClass(&wc)){
		MSG("クラスの登録失敗");
		return -1;
	}

	
	//インスタンスハンドル
	hinst=hInstance;

	hwnd=CreateWindowA("test","テストウィンドウ",WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
		0,0,400,400,NULL,NULL,hInstance,NULL);


	if(hwnd==NULL){
		MSG("ウィンドウ作成失敗");
		return -1;
	}


	//エラーチェック用変数
	int check;

	while(check=GetMessage(&msg,NULL,0,0)){
		if(check==-1){
			break;
		}
		DispatchMessage(&msg);
	}

	//クラス解放
	UnregisterClass("test",hinst);

	return 0;

}

これを実行してクライアント領域内で左クリックすると、画面の幅と高さを表示します。

次回はディレクトリの移動、作成、削除について説明します。


>> 【ディレクトリの移動、作成、削除】に進む
>> WINAPI入門トップに戻る