SetWindowLong

SetWindowLongで、ウィンドウの様々なLong値をセットできる。
GWL_WNDPROCで、新たなウィンドウプロシージャをセットして差し替える。

SetWindowLongA function (winuser.h) - Win32 apps | Microsoft Docs

SetWindowLong.cppで、WinMainは、

親ウィンドウと子ウィンドウで、2つのウィンドウクラスを登録。
親は白背景でウィンドウプロシージャがWindowProc。
子は淡灰色背景でウィンドウプロシージャがChildWindowProc。
WindowProcは、

WM_CREATEで子ウィンドウ作成。(スタティックコントロールってコメントは間違い。)
あと、マウスの左クリックで子ウィンドウのウィンドウプロシージャをSetWindowLongでThirdWindowProcに差し替え。
ChildWindowProcは、

子ウィンドウの領域を左クリックで"ChildWindowProc#Clicked!"がメッセージボックスで表示される。
ThirdWindowProcは、

子ウィンドウ領域を左クリックで"ThirdWindowProc#Clicked!"をメッセージボックス表示。

起動時
起動時

起動時。
グレーの領域が子ウィンドウ。

グレーの領域をクリックするとこれが出る
グレーの領域をクリックするとこれが出る

グレーの領域をクリックするとこれが出る。

白い親ウィンドウ領域をクリックするとこれが出て差し替えが発生
白い親ウィンドウ領域をクリックするとこれが出て差し替えが発生

白い親ウィンドウ領域をクリックするとこれが出て差し替えが発生。

その後、またグレーをクリックするとこうなる
その後、またグレーをクリックするとこうなる

その後、またグレーをクリックするとこうなる。
ChildWindowProcがThirdWindowProcに差し替えられてるのがわかる。

Sample/winapi/SetWindowLong/SetWindowLong/src/SetWindowLong at master · bg1bgst333/Sample · GitHub