SetWindowLong(A)

指定されたウィンドウの属性を変更します。また、拡張ウィンドウメモリの指定されたオフセットの32ビット値を書き換えることができます。

この関数は SetWindowLongPtr に取って代わられています。32ビット版と64ビット版の Windows で共通して利用できるコードを記述する場合には、 SetWindowLongPtr 関数を使用する必要があります。

LONG SetWindowLongA(
    HWND  hWnd,       // ウィンドウハンドル
    int   nIndex,     // 変更するデータの指定
    LONG  dwNewLong   // 新しい値
);

USER32.DLL

引数

hWnd

属性を変更するウィンドウのハンドルを指定します。

Windows 95/98/Me: 呼び出しスレッドとは異なるプロセスに属するウィンドウのハンドルを指定すると、この関数は失敗します。

nIndex

どの情報を変更するのかを指定します。

拡張ウィンドウメモリからデータを書き換えるときは、 0 から始まるオフセットをバイト単位で指定します。有効なオフセットは、 0 から (拡張ウィンドウメモリのバイト数 - 4) までです。

拡張ウィンドウメモリ以外の値を変更するには、次のいずれかを指定します。

p>
設定される属性
-4 (GWL_WNDPROC) ウィンドウプロシージャのアドレス

Windows NT/2000/XP: 指定されたウィンドウが呼び出しスレッドとは異なるプロセスに属する場合は、この属性を変更することはできません。

-6 (GWL_HINSTANCE) アプリケーションのインスタンスハンドル
-16 (GWL_STYLE) ウィンドウスタイル
-20 (GWL_EXSTYLE) 拡張ウィンドウスタイル
-21 (GWL_USERDATA) ウィンドウに関連付けられたアプリケーション定義の32ビット値
-12 (GWL_ID) ウィンドウ ID

hWnd パラメータがダイアログボックスのハンドルである場合には、以下の値を指定することもできます。

設定される属性
0 (DWL_MSGRESULT) ダイアログボックスプロシージャで処理されたメッセージの戻り値
4 (DWL_DLGPROC) ダイアログボックスプロシージャのアドレス
8 (DWL_USER) アプリケーション定義の情報(ハンドルやポインタなど)
dwNewLong

新しく設定する32ビット値を指定します。

戻り値

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

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

変更前の値が 0 だったとき、成功しても 0 が返ります。この問題を解決するには、 SetLastError 関数を引数 0 で呼び出してから、 SetWindowLong 関数を呼び出します。関数が失敗すると、直後に呼び出す GetLastError 関数が 0 以外の値を返します。

解説

いくつかの種類のデータはキャッシュされていて、 SetWindowLong 関数で変更されたそのデータは SetWindowPos 関数が呼び出されるまで反映されません。特に、データの変更によってウィンドウフレームのスタイルが変更される場合には、 SWP_FRAMECHANGED フラグを指定して SetWindowPos 関数を呼び出して、キャッシュを更新しなければなりません。

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

拡張ウィンドウメモリは、 RegisterClassEx 関数に渡す WNDCLASSEX 構造体(または RegisterClass 関数に渡す WNDCLASS 構造体)の cbWndExtra メンバに 0 以外の値を設定することによって確保します。

nIndex パラメータに GWL_HWNDPARENT を指定することはできません。子ウィンドウの親ウィンドウを変更するには、 SetParent 関数を使います。

対応情報

Windows 95 以降 / Windows NT 3.1 以降