コードは嘘を付きません。世には四月馬鹿などと言う行事もあるようですが、コードだけなら何も問題はありません。ま、私は明日更新するつもり無いですけど。
ごく簡単なランチャを 1 時間ぐらいででっちあげたんですが、そのときにフォームのサイズの変更を制限したいなと思いまして。取りあえず Resize イベント辺りで元サイズに書き戻すように実装してみたらこれがまあちらついて堪りません。
じゃあどうするかという時に、イベントを探すんではなく Windows メッセージを探すのが私の捻くれたところ。WM_WINDOWPOSCAHNGING をハンドルすれば目的を達成できそうでした。
ちょっとした問題点として、このメッセージの LParam が構造体へのポインタであることが挙げられます。C++/CLI ならともかく、C# では Marshal クラスで構造体にコピーするか unsafe コンテキストでポインタとして扱うかってことになりますが、それ以前に構造体の宣言が面倒です。
そこで、ここは一つ Marshal.ReadInt32/WriteInt32 で直接いじることにしました。注意するのはオフセットで、構造体の先頭に HWND 型があるため固定値決め撃ちってわけにはいきません。Marshal.SizeOf もありますが、もうちょっと簡単に IntPtr.Size プロパティを使って計算しましょう。
以下に、簡単な実装コードを書いておきます。なお、WM_WINDOWPOSCHANGING に使われる WINDOWPOS 構造体には Z オーダー位置、各種フラグが用意されていますが、簡便のため今回の実装では位置とサイズしか処理しません。興味のある方は調べてみて下さい。
ちなみに、これで高さを固定して、フォームの上辺を掴んでリサイズさせようとしたりすると結構気持ち悪い動きになります。
以下コードと使用例