ウィンドウの情報

テキストの取得/設定

テキストの取得や設定に関してはSendMessage関数#テキストの書き換えの項を参照してください。

ウィンドウの位置とサイズ

ウィンドウの位置とサイズの取得/設定はウィンドウの位置とサイズの項を参照してください。

クラス名の取得

GetClassName関数

ウィンドウのクラス名を取得するにはGetClassName関数を使用します。

int GetClassNameW(
 HWND hWnd,
 LPWSTR lpClassName,
 int nMaxCount
);
ウィンドウhWndのクラス名をバッファlpClassNameにnMaxCount文字数分格納する。

クラス名はCreateWindow関数の第一引数に指定した文字列です。
取得する文字数にはNULL文字も含みますので、実際に取得できる文字数は「nMaxCount-1」までです。

クラス情報の取得

GetClassInfo関数

ウィンドウクラスの情報(WNDCLASS構造体)を取得するにはGetClassInfo関数を使用します。

BOOL GetClassInfoW(
 HINSTANCE hInstance,
 LPCWSTR lpClassName,
 LPWNDCLASSW lpWndClass
);
インスタンスhInstanceが持つウィンドウクラスlpClassNameを取得し、lpWndClassに格納する。
成功した場合は0以外を、失敗した場合は0を返す。

第一引数hInstanceはアプリケーションのインスタンスハンドルです。
BUTTONクラスなどのシステム定義のクラスの情報を取得する場合はNULLを指定します。

第二引数lpClassNameはクラス名です。
GetClassName関数などで取得できます。

第三引数lpWndClassWNDCLASS構造体へのポインタです。

GetClassInfoEx関数

WNDCLASS構造体ではなくWNDCLASSEX構造体の情報を取得する場合はGetClassInfoEx関数を使用します。

BOOL GetClassInfoExW(
 HINSTANCE hInstance,
 LPCWSTR lpszClass,
 LPWNDCLASSEXW lpwcx
);
インスタンスhInstanceが持つウィンドウクラスlpszClassを取得し、lpwcxに格納する。
成功した場合は0以外を、失敗した場合は0を返す。

WNDCLASS構造体がWNDCLASSEX構造体になっている以外はGetClassInfo関数と同じです。

ウィンドウに関する情報1

GetWindowLongPtr関数

GetWindowLongPtr関数は、ウィンドウハンドルから様々な情報を取得することができます。

LONG_PTR GetWindowLongPtrW(
 HWND hWnd,
 int nIndex
);
ウィンドウhWndの属性nIndexを取得する。
失敗した場合は0を返す。

第二引数には以下の定数のいずれかを指定します。

定数 説明
GWLP_WNDPROC ウィンドウプロシージャのポインタ
GWLP_HINSTANCE アプリケーションのインスタンスハンドル
GWLP_HWNDPARENT 親ウィンドウのハンドル
(無ければNULL)
GWLP_USERDATA ウィンドウに関連付けられているユーザーデータ
GWLP_ID ウィンドウの識別子
GWL_STYLE ウィンドウスタイル
GWL_EXSTYLE 拡張ウィンドウスタイル

ダイアログボックスのウィンドウハンドルを指定した場合は以下の定数を使用できます。

定数 説明
DWLP_DLGPROC ダイアログボックスプロシージャへのポインタ
DWLP_MSGRESULT ダイアログボックスプロシージャで処理されたメッセージの戻り値
DWLP_USER ダイアログに関連付けられているユーザーデータ

戻り値はLONG_PTR型で、これは32bitアプリでは32bit、64bitアプリでは64bitのサイズの整数値です。
(ポインタ変数と同じサイズ)
目的の型(HWND型など)にキャストして使用します。
ウィンドウスタイルなどを取得した場合はビット演算でフラグをチェックします。

nIndexは上記の定数以外にも0以上の整数値を指定することもできます。
(上記の定数は全て負数で定義されている)
ウィンドウは拡張ウィンドウメモリという領域を持つことができ、nIndexが0以上の場合はそのメモリ領域へのオフセット(領域の先頭からの位置)の指定になります。
読み取るサイズはLONG_PTR型のサイズです。

拡張ウィンドウメモリはWNDCLASS(EX)構造体のcbWndExtraメンバでそのサイズを指定します。
例えばサイズが「32」なら、nIndexには「32 - sizeof(LONG_PTR)」までの値を指定できます。

SetWindowLongPtr関数

SetWindowLongPtr関数はウィンドウに様々な設定を行います。
設定できる項目はGetWindowLongPtr関数を参照してください。

LONG_PTR SetWindowLongPtrW(
 HWND hWnd,
 int nIndex,
 LONG_PTR dwNewLong
);
ウィンドウhWndの属性nIndexをdwNewLongに置き換える。
成功した場合は設定する以前の値を返す。
失敗した場合は0を返す。

定数GWL_STYLEGWL_EXSTYLEを指定することでウィンドウスタイルを変更することができますが、いくつかのウィンドウスタイルはシステムがキャッシュしていて、この関数を実行しただけでは変更が反映されないことがあります。
SetWindowLongPtr関数の実行後にSetWindowPos関数uFlagsSWP_FRAMECHANGEDフラグを含めて実行することで変更が反映されます。


//現在の拡張ウィンドウスタイルを取得
LONG_PTR styleEx = GetWindowLongPtr(hWnd, GWL_EXSTYLE);

//WS_EX_CLIENTEDGEフラグの反転
SetWindowLongPtr(hWnd, GWL_EXSTYLE, styleEx ^ WS_EX_CLIENTEDGE);

//変更を反映
SetWindowPos(hWnd, 0, 0, 0, 0, 0,
	SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED);
//SWP_NOSIZE:	ウィンドウサイズを変更しない
//SWP_NOMOVE:	ウィンドウを移動しない
//SWP_NOZORDER:	Zオーダーを変更しない

GetWindowLongPtr関数と同様に、nIndexは拡張ウィンドウメモリのオフセットとしても使用できます。

GetWindowLongPtr関数/SetWindowLongPtr関数と似たものにGetWindowLong関数/SetWindowLong関数があります。
これらは32bitアプリケーション用で、64bitアプリケーションには対応していません。
GetWindowLongPtr関数/SetWindowLongPtr関数は64ビット対応で、32ビットアプリではGetWindowLong関数/SetWindowLong関数と同じ動作をします。

ウィンドウに関する情報2

GetWindowInfo関数

GetWindowInfo関数はウィンドウに関する様々な情報を取得します。

BOOL GetWindowInfo(
 HWND hwnd,
 PWINDOWINFO pwi
);
ウィンドウhwndに関する情報を取得しpwiに格納する。
成功した場合は0以外を、失敗した場合は0を返す。

第二引数pwiWINDOWINFO構造体へのポインタです。
WINDOWINFO構造体は以下のように定義されています。

typedef struct tagWINDOWINFO {
 DWORD cbSize;
 RECT rcWindow;
 RECT rcClient;
 DWORD dwStyle;
 DWORD dwExStyle;
 DWORD dwWindowStatus;
 UINT cxWindowBorders;
 UINT cyWindowBorders;
 ATOM atomWindowType;
 WORD wCreatorVersion;
} WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;
ウィンドウの情報を格納する構造体。

cbSizeメンバはこの構造体のサイズで、GetWindowInfo関数に渡す前にあらかじめsizeof(WINDOWINFO)をセットしておく必要があります。

rcWindowメンバはウィンドウのスクリーン座標です。
rcClientメンバはクライアント領域のスクリーン座標です。

dwStyleメンバはウィンドウスタイルを示す値です。
dwExStyleメンバは拡張ウィンドウスタイルを示す値です。
ウィンドウスタイルについてはdwStyleの定数を、拡張ウィンドウスタイルについてはCreateWindowEx関数を参照してください。
なお、フラグの状態を調べるにはビット演算を使用します。

dwWindowStatusメンバはウィンドウのアクティブ状態です。
この値が0の場合はウィンドウは非アクティブ、定数WS_ACTIVECAPTION(1)の場合はウィンドウはアクティブです。

cxWindowBordersメンバはウィンドウの枠の幅です。
cyWindowBordersメンバはウィンドウの枠の高さです。
(ピクセル単位)

atomWindowTypeメンバはウィンドウのアトムです。
アトムについてはRegisterClass関数を参照してください。

wCreatorVersionメンバはウィンドウを作成したアプリケーションのWindowsのバージョンです。
…とMirosoftのドキュメントでは説明されているのですが、何の値なのかはよくわかりません。
少なくともアプリケーションを実行中のWindowsのバージョンやアプリを作成したWindowsのバージョンではありません。
おそらく、そのアプリケーションを実行可能な最小の(最も古い)Windowsのバージョンか何かと思われます。
なお、数値が表すWindowsのバージョンについては以下のMicrosoftのサイトを参照してください。
(16進数表記です)
WINVER および _WIN32_WINNT の更新