私はマットに同意します。「MaximizedBounds」を設定することはお勧めできません。ウィンドウが最大化/最大化解除されたときのイベント に書かれているように、WndProc メソッドをオーバーライドします。そこでは、ウィンドウから受け取ったさまざまなコマンドを自分で処理できます。
主に行うべきことは、"SC_MAXIMIZE"-windowcommand 用の独自のコードを作成することです (上記の参照記事に記載されているとおり)。そこで、フォームのサイズを手動で設定できます。たとえば、この場合、フォームは実際には最大化されません。実際には、まだ通常の WindowState のままです。ユーザーがこの状態を変更できないようにするには、他のウィンドウ コマンドを「キャッチ」する必要があります。
オーバーライドされた WndProc メソッドは次のようになります。
protected override void WndProc(ref Message m)
{
if(m.Msg == 0x0112) // WM_SYSCOMMAND
{
if(m.WParam == new IntPtr(0xF012)) //TITLE_CLICK_ONCE
{
// catch, this command can occur, when form starts to move
}
if(m.WParam == new IntPtr(0xF001) // RESIZE_ON_EDGE
|| m.WParam == new IntPtr(0xF002)
|| m.WParam == new IntPtr(0xF003)
|| m.WParam == new IntPtr(0xF004)
|| m.WParam == new IntPtr(0xF005)
|| m.WParam == new IntPtr(0xF006)
|| m.WParam == new IntPtr(0xF007)
|| m.WParam == new IntPtr(0xF008))
{
// catch the resizing
}
if(m.WParam == new IntPtr(0xF032)) // SECOND_CLICK_ON_TITLEBAR
{
// catch. causes a maximization (or resuming to normal window-mode)
}
if(m.WParam == new IntPtr(0xF030)) //SC_MAXIMIZE
{
// the actual point, where to enter your code
// this command occurs, when the "Maximize"-button is pressed
}
}
// maybe abort calling of the base-method at specified window-commands,
// when you want to make your own code by simply "return;"
base.WndProc(ref m);
}