<Return[S]><Top>

SetWindowLongPtr

Declare Function Api_SetWindowLongptr& Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&)

Declare Function SetWindowLongptr Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

指定されたウィンドウの属性を変更する。拡張ウィンドウメモリ内の指定されたオフセット位置にある値を書き換えることもできる。
この関数は、SetWindowLong 関数の改訂版である。32 ビット版 Windows と 64 ビット版 Windows の両方ともと互換性のあるコードを記述するには、SetWindowLongPtr 関数を使う。

パラメータ
hWnd
    ウィンドウのハンドルを指定する。呼び出し側スレッドとは異なるプロセスに属しているウィンドウを hWnd パラメータで指定すると、この関数

    は失敗する。
nIndex
    拡張ウィンドウメモリ内の値を変更するには、0 から始まるオフセットを指定する。有効なオフセットは、0 から拡張ウィンドウメモリのバイト

    数 -8 までである。たとえば、拡張メモリが 24 バイト以上ある場合、16 を指定すると、3 番目の整数値を変更できる。その他の値を変更

    するには、次のいずれかの値を指定する。

    値                           

動作                                                                                                                                              

    GWL_EXSTYLE

新しい拡張ウィンドウスタイルを設定する。

    GWL_STYLE

新しいを設定する。

    GWL_WNDPROC

ウィンドウプロシージャへの新しいアドレスを設定する。

    GWL_HINSTANCE

新しいアプリケーションインスタンスハンドルを設定する。

    GWL_ID

新しいウィンドウ ID を設定する。

    GWL_USERDATA

 

ウィンドウに関連付けられた値を設定する。この 32 ビット値は、ウィンドウを作成したアプリケーションで使用する目的で各ウィンドウが持っているものである。この値の初期値は 0 である。

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

    値                           

動作                                                                                                       

    DWL_DLGPROC

ダイアログボックスプロシージャへの新しいポインタを設定する。

    DWL_MSGRESULT

ダイアログボックスプロシージャ内で処理されたメッセージの戻り値を設定する。

    DWL_USER

ハンドルやポインタなどのアプリケーション固有の拡張情報を変更する。

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

戻り値
    関数が成功すると、変更した情報の変更前の値が返る。
    関数が失敗すると、0 が返る。拡張エラー情報を取得するには、 関数を使う。
    変更前の値が 0 だった場合、関数が成功しても戻り値は 0 になるが、この場合でも最終エラー情報はクリアされない。関数が成功した

    か失敗したかを調べるには、まず 関数に 0 を渡して最終エラー情報をクリアしてから、SetWindowLongPtr 関数を呼び出す。こうすれば、

    0が返された場合でも、GetLastError 関数の結果が 0 以外の値になるかどうかを調べることで、関数が失敗したかどうかを判断できる。

 

解説
    ウィンドウデータの一部はキャッシュされているため、SetWindowLongPtr 関数を使って変更しても、SetWindowPos 関数を呼び出すまで

    はその変更が有効にならない。
    GWLP_WNDPROC インデックスを指定して SetWindowLongPtr 関数を呼び出すことにより、ウィンドウプロシージャを変更する場合、新

    しいウィンドウプロシージャは、WindowProc コールバック関数の説明に示されているガイドラインに従っていなければならない。
    DWLP_MSGRESULT インデックスを指定して SetWindowLongPtr 関数を呼び出すことにより、ダイアログボックスプロシージャで処理され

    たメッセージの戻り値を変更した場合、その直後からそのダイアログボックスプロシージャでは TRUE を返すようにする。こうしなければ、ダ

    イアログボックスプロシージャがウィンドウメッセージを受け取るための関数を呼び出した場合に、DWLP_MSGRESULT を使って設定した戻

    り値が、ネストされたウィンドウメッセージにより上書きされてしまう。
    GWLP_WNDPROC インデックスを指定して SetWindowLongPtr 関数を呼び出すと、ウィンドウクラスのサブクラスが作成され、それがウ

    ィンドウの作成に使われるようになる。システムクラスのサブクラスは作成してもかまわないが、他のプロセスで生成されたウィンドウクラスの

    サブクラスは作成しないようにする。SetWindowLongPtr 関数は、ウィンドウクラスに関連付けられたウィンドウプロシージャを変更することに

    よりウィンドウクラスをサブクラス化するため、それ以降システムは変更前のウィンドウプロシージャではなく新しいウィンドウプロシージャを呼び

    出すようになる。新しいウィンドウプロシージャでは処理されないようなメッセージは、CallWindowProc 関数を呼び出すことによって変更前の

    ウィンドウプロシージャへ渡さなければならない。これは、アプリケーションがウィンドウプロシージャのチェインを作ることを可能にする。
    拡張ウィンドウメモリは、RegisterClassEx 関数に渡す 構造体の cbWndExtra メンバに 0 以外の値を設定することによって確保する。
    GWLP_HWNDPARENT インデックスを指定して SetWindowLongPtr 関数を呼び出すこ
    とにより子ウィンドウの親を変更してはならない。親ウィンドウの変更には、SetParent 関数を使う。