SetWindowLongPtr

https://msdn.microsoft.com/ja-jp/library/ms632600.aspx https://msdn.microsoft.com/ja-jp/library/cc428944.aspx https://msdn.microsoft.com/ja-jp/library/cc428989.aspx https://msdn.microsoft.com/ja-jp/library/ms633577.aspx https://msdn.microsoft.com/ja-jp/library/ms633577.aspx

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

LONG_PTR SetWindowLongPtr(
  HWND hWnd,           // ウィンドウのハンドル
  int nIndex,          // 変更する値のオフセット
  LONG_PTR dwNewLong   // 新しい値
);

パラメータ

hWnd
ウィンドウのハンドルを指定します。呼び出し側スレッドとは異なるプロセスに属しているウィンドウを hWnd パラメータで指定すると、この関数は失敗します。
nIndex
拡張ウィンドウメモリ内の値を変更するには、0 から始まるオフセットを指定します。有効なオフセットは、0 から拡張ウィンドウメモリのバイト数 -8 までです。たとえば、拡張メモリが 24 バイト以上ある場合、16 を指定すると、3 番目の整数値を変更できます。その他の値を変更するには、次のいずれかの値を指定します。
動作
GWL_EXSTYLE新しい拡張ウィンドウスタイルを設定します。
GWL_STYLE新しいを設定します。
GWLP_WNDPROCウィンドウプロシージャへの新しいアドレスを設定します。
GWLP_HINSTANCE新しいアプリケーションインスタンスハンドルを設定します。
GWLP_ID新しいウィンドウ ID を設定します。
GWLP_USERDATAウィンドウに関連付けられた値を設定します。この 32 ビット値は、ウィンドウを作成したアプリケーションで使用する目的で各ウィンドウが持っているものです。この値の初期値は 0 です。

hWnd パラメータでダイアログボックスを指定しているときは、次の値も指定できます。

動作
DWLP_DLGPROCダイアログボックスプロシージャへの新しいポインタを設定します。
DWLP_MSGRESULTダイアログボックスプロシージャ内で処理されたメッセージの戻り値を設定します。
DWLP_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 関数を使ってください。

対応情報

  Windows NT/2000:Windows NT 3.1 以降
  Windows 95/98:Windows 95 以降
  Windows CE:Windows CE 1.0 以降
  ヘッダー:winuser.h 内で宣言
  インポートライブラリ:user32.lib を使用
  Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装

参照

CallWindowProcGetWindowLongPtrRegisterClassExSetParentWindowProc

表示: