ごぶさたしてます、ぺんたごんです タイトルが適切かわからないんですが、 Formのサイズ変更を右・下・右下しか掴めないようにしたいと思ってます。 経緯としては独自ドロップダウンコントロールを作っており、 ドロップダウンで出てくるパネル的なのをFormでやろうとしてます。 自前でサイズ変更グリップ実装するのもめんどいので イベントやメッセージをフックして抑止してしまおうと考えました。 WM_SIZINGなら掴んだ辺を判定できるので、 以下のようにWndProcをオーバーライドしてみました。 protected override void WndProc(ref Message m) { if (m.Msg == 0x0214) { switch (m.WParam.ToInt32()) { case 1: // 左 case 3: // 上 case 4: // 左上 case 5: // 右上 case 7: // 左下 m.Result = IntPtr.Zero; return; } } base.WndProc(ref m); } しかし普通にサイズ変更できてしまいます。 ググって出てくるウィンドウの移動やクローズを抑止する的な奴は 全部この方法なんですが、サイズ変更に関しては不可能なんでしょうか。 試しにWM_SIZEもフックして強制的にreturnしてみましたが 相変わらず…WndProcじゃなくても何か方法ありましたら ご教示いただけると助かります。 よろしくお願いいたします
■No35067に返信(Hongliangさんの記事) > よくある方法としては、WM_NCHITTESTで、HTTOPとかが来た時にNTCLIENTを返す、といったやり方でしょうか。 迅速な回答ありがとうございます。 なるほど、ヒットテストの段階で誤認させることで マウスカーソルの変化も防げるということですね。 以下の方法で行けました。 ポイントは、実際に触った場所を知るために よくあるWndProcのセオリーと違って先にbaseを呼んで、 その後は2回呼ばないよう注意すべき点でしょうかね。 HTCLIENTと判定して何か変な挙動を引き起こしてもアレなので 今回はZeroをぶち込んでヒットしなかったことにしました。 protected override void WndProc(ref Message m) { if (m.Msg == 0x0084) // WM_NCHITTEST { base.WndProc(ref m); // 先に呼ぶ switch (m.Result.ToInt32()) { case 10: // 左 case 12: // 上 case 13: // 左上 case 14: // 右上 case 16: // 左下 m.Result = IntPtr.Zero; break; } return; } base.WndProc(ref m); } 感謝です!