質問
私のアプリケーションでは、メインフォームの最小化ボタンを一時的にグレー表示する必要があります。どのようにこれを達成することができますか? Win32 dllに対してp / invokesを実行しても構いません。
編集:最小化ボタンをグレー表示することが推奨される解決策ですが、フォームが最小化されないようにする他の方法はありますか?
解決
私の回答に関してあなたのコメントを読み、より完全な解決策を提案することができました。私はこれをすぐに実行しましたが、それはあなたが望む振る舞いを持っているように見えました。フォームからwinformsを派生する代わりに、このクラスから派生します。
using System;
using System.Windows.Forms;
using System.ComponentModel;
namespace NoMinimizeTest
{
public class MinimizeControlForm : Form
{
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MINIMIZE = 0xf020;
protected MinimizeControlForm()
{
AllowMinimize = true;
}
protected override void WndProc(ref Message m)
{
if (!AllowMinimize)
{
if (m.Msg == WM_SYSCOMMAND)
{
if (m.WParam.ToInt32() == SC_MINIMIZE)
{
m.Result = IntPtr.Zero;
return;
}
}
}
base.WndProc(ref m);
}
[Browsable(true)]
[Category("Behavior")]
[Description("Specifies whether to allow the window to minimize when the minimize button and command are enabled.")]
[DefaultValue(true)]
public bool AllowMinimize
{
get;
set;
}
}
}
たとえば、クリックの送信時に最小化を許可するかどうかを決定できるようにしたい場合は、もう少しやることができます。
using System;
using System.Windows.Forms;
using System.ComponentModel;
namespace NoMinimizeTest
{
public class MinimizeControlForm : Form
{
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MINIMIZE = 0xf020;
protected MinimizeControlForm()
{
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SYSCOMMAND)
{
if (m.WParam.ToInt32() == SC_MINIMIZE && !CheckMinimizingAllowed())
{
m.Result = IntPtr.Zero;
return;
}
}
base.WndProc(ref m);
}
private bool CheckMinimizingAllowed()
{
CancelEventArgs args = new CancelEventArgs(false);
OnMinimizing(args);
return !args.Cancel;
}
[Browsable(true)]
[Category("Behavior")]
[Description("Allows a listener to prevent a window from being minimized.")]
public event CancelEventHandler Minimizing;
protected virtual void OnMinimizing(CancelEventArgs e)
{
if (Minimizing != null)
Minimizing(this, e);
}
}
}
このウィンドウ通知の詳細については、 MSDNの記事。
他のヒント
form.MinimizeBox = false;
またはフォームスコープ内の場合
MinimizeBox = false;
MinimizeBox = false;フォームのコード内。
このコードをフォームのResizeイベントに追加します:
if (this.WindowState == FormWindowState.Minimized)
{
this.WindowState = FormWindowState.Normal;
}
これにより、フォームが最小化できなくなります(免責事項:この方法でウィンドウの標準動作を変更することは推奨しません)。
コマンドをキャンセルするために、最小化イベントへのハンドルを実装することもできます
しないでください。私の窓を台無しにしないでください。彼らはあなたのものではなく私のものです。それは私のコンピューターであり、もし最小化したければ、できるはずです。これを行う正当な理由は考えられないし、与えられたこともない。
コインコインの答えは正しいです。 MinimizeBoxは、デザイナーのプロパティウィンドウでプロパティとしても使用できます。
@Kevin:センチメントには感謝していますが、それは必ずしも有効な答えではありません。アプリケーションがフォームの新しいインスタンスを作成し、その上で.ShowDialog()を呼び出してモーダルダイアログボックスを表示する場合、メインUIスレッドのすべての入力がブロックされるまで、ユーザーにそのフォームを最小化させたくないそのフォームのモーダルステータスが満たされている。ユーザーはメインフォームをクリックし、「ding ding ding」を取得できます。 Windowsからの応答のないサウンドで、何をすべきかわからない。
フォームのMinimizeBoxプロパティをfalseに設定するだけです。 これにより、最小化ボタンが無効になりますが、他のボタンは機能し続けます。