プラットフォーム SDK
SetWindowLong

指定されたウィンドウの属性を変更します。拡張ウィンドウメモリ内の指定されたオフセット位置にある long データ(32 ビット値)も設定できます。

この関数に代わる関数として、SetWindowLongPtr 関数があります。32 ビット Windows と 16 ビット Windows の両方と互換性のあるコードを記述するには、SetWindowLongPtr 関数を使ってください。

LONG SetWindowLong(
  HWND hWnd,       // ウィンドウのハンドル
  int nIndex,      // 設定する値のオフセット
  LONG dwNewLong   // 新しい値
);

パラメータ

hWnd
ウィンドウのハンドルを指定します。クラスも間接的に指定したことになります(指定したウィンドウの属するクラスが使われます)。

Windows 95/98:hWnd パラメータで指定したウィンドウが SetWindowLong 関数を呼び出したスレッドと同じプロセスに属していないと、SetWindowLong 関数は失敗します。

nIndex
設定する値の 0 から始まるオフセットを指定します。有効な値は、0 から拡張ウィンドウメモリのバイト数より 4 小さい値までです。たとえば、12 バイト以上の拡張ウィンドウメモリを持つクラスを指定した場合なら、8 を指定すると、3 番目の 32 ビット値が書き換えられます。拡張ウィンドウメモリ以外のデータを書き換えるときは、次の値のいずれかを指定します。
動作
GWL_EXSTYLE拡張ウィンドウスタイルを書き換えます。詳細については、CreateWindowEx 関数の説明を参照してください。
GWL_STYLE を書き換えます。
GWL_WNDPROCウィンドウプロシージャのアドレスを書き換えます。

Windows NT/2000:この属性は、ウィンドウが関数を呼び出したスレッドと同じプロセスに属していないと変更できません。

GWL_HINSTANCEアプリケーションのインスタンスハンドルを書き換えます。
GWL_IDウィンドウの ID を書き換えます。
GWL_USERDATAウィンドウに関連付けられている 32 ビット値を書き換えます。各ウィンドウは、それに対応する 32 ビット値を持っています。この値は、ウィンドウを作成したアプリケーションが自由に使用できるもので、0 で初期化されています。

hWnd パラメータで指定したウィンドウがダイアログボックスの場合は、次の値も指定できます。

動作
DWL_DLGPROCダイアログボックスプロシージャのアドレスを設定します。
DWL_MSGRESULTダイアログボックスプロシージャ内で処理されたメッセージの戻り値を設定します。
DWL_USERハンドルやポインタなどの、アプリケーション固有の拡張情報を設定します。

dwNewLong
新しく設定する値を指定します。

戻り値

関数が成功すると、変更前の値が返ります。

関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、 関数を使います。

変更前の値が 0 で関数が成功した場合、戻り値として 0 が返りますが、この呼び出しにより前回のエラー情報がクリアされることはありません。このため、関数が成功したのか失敗したのかを判断することが難しくなります。この問題に対処するには、SetWindowLong 関数を呼び出す前に、 関数を引数に 0 を指定して呼び出すことにより前回のエラー情報をクリアしておきます。こうすれば、関数が失敗して 0 が返された場合にだけ、GetLastError 関数の戻り値が 0 以外の値になります。

解説

ウィンドウデータの中には、キャッシュされており、SetWindowLong 関数を使って変更しても SetWindowPos 関数を呼び出すまでは有効にならないものもあります。特に、フレームスタイルを変更した場合は、SWP_FRAMECHANGED フラグをセットして SetWindowPos 関数を呼び出すさなければ、キャッシュが正しく更新されません。

SetWindowLong 関数と GWL_WNDPROC インデックスを使用してウィンドウプロシージャを置き換える場合、ウィンドウプロシージャは、WindowProc コールバック関数の説明に示した指針に従っていなければなりません。

DWL_MSGRESULT インデックスを指定して SetWindowLong 関数を呼び出すことにより、ダイアログプロシージャで処理されるメッセージの戻り値を設定する場合、その後は直接 0 以外の値(True)を返さなければなりません。こうしないと、それ呼び出した結果このダイアログプロシージャがウィンドウメッセージを受け取ることになるような関数を呼び出したときには、DWL_MSGRESULT を使って設定した戻り値がネストされたウィンドウメッセージにより上書きされてしまいます。

GWL_WNDPROC インデックスを指定して SetWindowLong 関数を呼び出すと、ウィンドウの作成に使用されるウィンドウクラスのサブクラスが作成されます。アプリケーションでシステムクラスをサブクラス化してもかまいませんが、ほかのプロセスで作成されたウィンドウクラスはサブクラス化しないでください。SetWindowLong 関数は、特定のウィンドウクラスに関連付けられているウィンドウプロシージャを変更し、システムが以前のウィンドウプロシージャではなく新しいウィンドウプロシージャを呼び出すようにすることによって、ウィンドウをサブクラス化します。新しいウィンドウプロシージャで処理しないメッセージは、CallWindowProc 関数を呼び出して、以前のウィンドウプロシージャに渡してください。これにより、ウィンドウプロシージャのチェインが実現できます。

拡張ウィンドウメモリを確保するには、RegisterClassEx 関数に渡す 構造体の cbWndExtra メンバに 0 以外の値を設定します。

子ウィンドウの親を変更するときは、GWL_HWNDPARENT インデックスを指定して SetWindowLong 関数を呼び出すのではなく、SetParent 関数を使ってください。

対応情報

Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダー:Winuser.h で宣言、Windows.h をインクルード
インポートライブラリ:User32.lib を使用
Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装

参照

CallWindowProc, GetWindowLong, RegisterClassEx, SetParent, SetWindowLongPtr, WindowProc,

Page view tracker