椿の日記

たぶんプログラムの話をします

カーソルをアクティブウィンドウのクライアント領域に制限する

カーソルをアクティブウィンドウのクライアント領域に制限するには、Win32 APIの ClipCursor 関数を使うのですが、なかなか期待する動作をしてくれません。

多くのサイトでは、ウィンドウのアクティブ/非アクティブ状態をWM_ACTIVATEで検出し、クリッピングの開始と終了を行えばよい、と解説されています。しかしこの方法だけだと、ウィンドウを非アクティブな状態から「タイトルバーをクリックして」アクティブ状態にした場合、カーソルがデスクトップ全体を移動できる状態になってしまいます。

きちんと調べたわけではないのですが、どうもWM_ENTERSIZEMOVE~WM_EXITSIZEMOVEの間で勝手にClipCursorの設定が無効化されているようです。

ということで、WM_EXITSIZEMOVEの中でもClipCursorします。これにより、ウィンドウの移動を終えた後に、カーソルをクライアント領域にクリッピングできるようになります。