ウィンドウの情報
テキストの取得/設定
テキストの取得や設定に関しては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関数などで取得できます。
第三引数lpWndClass
はWNDCLASS
構造体へのポインタです。
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_STYLE
やGWL_EXSTYLE
を指定することでウィンドウスタイルを変更することができますが、いくつかのウィンドウスタイルはシステムがキャッシュしていて、この関数を実行しただけでは変更が反映されないことがあります。
SetWindowLongPtr関数の実行後にSetWindowPos関数のuFlags
にSWP_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を返す。
第二引数pwi
はWINDOWINFO
構造体へのポインタです。
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 の更新