XPから登場した新しいサブクラス化を使用する方法を説明します。元のウインドウプロシージャを保存したり呼び出したりする作業は必要ありません。サブクラスコールバックをウインドウに設定するには、SetWindowSubclassを呼び出します。dwRefData);hWndは、サブクラス化したいウインドウハンドルを指定します。pfnSubclassは、新しいウインドウプロシージャのアドレスを指定します。uIdSubclassは、サブクラスIDを指定します。dwRefDataは、サブクラスコールバックに関連付けるデータを指定します。サブクラスコールバックは、pfnSubclassとuIdSubclassで一意に識別されます。ウインドウに設定したサブクラスコールバックを解除するには、RemoveWindowSubclassを呼び出します。これにより、ウインドウへのメッセージは、既定のウインドウプロシージャに送られるようになります。uIdSubclass);hWndは、サブクラス化されたウインドウハンドルを指定します。pfnSubclassは、ウインドウプロシージャのアドレスを指定します。uIdSubclassは、サブクラスIDを指定します。サブクラスコールバックのウインドウプロシージャは、SUBCLASSPROCという型を持ちます。SetWindowSubclassに指定することになります。dwRefData);hWndは、ウインドウハンドルが格納されます。uMsgは、ウインドウメッセージが格納されます。wParamは、WPARAM値が格納されます。lParamは、LPARAM値が格納されます。uIdSubclassは、サブクラスIDが格納されます。dwRefDataは、サブクラスコールバックに関連付けられたデータが格納されます。上記したウインドウプロシージャで独自に処理しないメッセージは、DefSubclassProcに指定することになります。lParam);hWndは、サブクラス化されたウインドウハンドルを指定します。uMsgは、ウインドウメッセージを指定します。wParamは、WPARAM値を指定します。lParamは、LPARAM値を指定します。今回のプログラムは、SetWindowSubclassを呼び出してボタンをサブクラス化します。SetWindowSubclassなどの関数を呼び出すには、commctrl.hのインクルードとcomctl32.libへのリンクが必要になります。TEXT("ボタンがEnterキーで選択されました。lParam);}SetWindowSubclassの第2引数は、独自のウインドウプロシージャのアドレスを指定します。第3引数はサブクラスIDであり、今回は1を指定します。ここに指定した値は第2引数のウインドウプロシージャの引数から参照することができます。今回は特に渡すデータがないため、0を指定しています。これは必ず必要というわけではありません。子ウインドウが破棄される前に、元のウインドウプロシージャに戻そうと思っただけのことです。RemoveWindowSubclassの第2引数と第3引数は、SetWindowSubclassのそれと同一になっていなければなりません。SubclassProcには、ボタンに関する全てのメッセージが送られることになります。デフォルトの処理を行うようにします。WM_KEYDOWNでキー入力の検出をするようにしています。した方法を用いる必要があります。