ウィンドウメッセージその1

今回は検索(ウィンドウメッセージとかのワード)で来た方への記事になります。


Windowsプログラミングにおいて必須なのがウィンドウメッセージの処理です。
エディットコントロールにしても、ツリービュー、リストビュー等コモンコントロール等にしても、ウィンドウメッセージの処理方法がプリセットされているだけですので、挙動を変更するには、コントロールにウィンドウメッセージが到達する直前に横取りして処理すれば良いです。
(コントロールを自作する場合は、RegisterClassでそのまま独自のプロシージャを登録します)


// 1.ウィンドウプロシージャを独自のものに置き換える(サブクラス化)
WNDPROC m_pProc = (WNDPROC)::GetWindowLong(m_hEdit, GWL_WNDPROC);

SetWindowLong(m_hEdit, GWL_WNDPROC, (LONG)HookProc);

// 2.プロシージャ内からメンバを呼ぶ為にウィンドウハンドルにthisを隠しておく。

SetWindowLong(m_hEdit, GWL_USERDATA, (LONG)this);

2.ではGWL_USERDATAにポインタを隠してますが、プロシージャ自体にポインタを送り込むトリッキーな技もあります。


次に実際に挙動を変更してみます。
例えばエディットコントロール上でキャレット位置を変更する方法のひとつに、「左クリックする」ことがあります。
基本的にコントロールは全てウィンドウメッセージで処理するので、この場合はWM_LBUTTONDOWN(もしくはUP) が処理されていると推測できます。
なのでこれを無効にしたければ、このメッセージが飛んで来た時に元々のプロシージャを呼ばなければ良いわけです。

(その2につづく)