6

私のアプリケーションでは、メインフォームの最小化ボタンを一時的にグレー表示する必要があります。これをどのように達成できるかについてのアイデアはありますか?Win32dllに対してp/invokesを実行してもかまいません。

編集:最小化ボタンをグレー表示することをお勧めしますが、フォームが最小化されるのを防ぐ他の方法はありますか?

4

8 に答える 8

11

私の回答に関するあなたのコメントを読み、より完全な解決策を打ち出すことができました. これをすばやく実行したところ、あなたが望んでいた動作をしているように見えました。Form から 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 の記事を参照してください。

于 2008-11-26T09:28:58.093 に答える
10
form.MinimizeBox = false;

またはフォームスコープの場合

MinimizeBox = false;
于 2008-11-25T22:37:48.330 に答える
1

MinimizeBox=false;を実行するだけです。フォームのコードで。

于 2008-11-25T22:38:35.130 に答える
1

次のコードをフォームの Resize イベントに挿入します。

if (this.WindowState == FormWindowState.Minimized)
{
    this.WindowState = FormWindowState.Normal;
}

これにより、フォームが最小化できなくなります (免責事項: この方法でウィンドウの標準的な動作を変更することはお勧めしません)。

于 2008-11-25T22:58:47.087 に答える
0

Minimize イベントにハンドルを実装して、コマンドをキャンセルすることもできます

于 2008-11-25T22:56:46.513 に答える
0

しないでください。私の窓を台無しにしないでください。それらは私のものであり、あなたのものではありません。それは私のコンピューターであり、最小化したい場合は、できるはずです。これを行う正当な理由は思いつきませんし、与えられたこともありません。

于 2008-11-25T23:02:45.957 に答える
0

コインコインの答えは正しいです。MinimizeBox は、デザイナーのプロパティ ウィンドウのプロパティとしても利用できます。

@ケビン:私はその感情に感謝していますが、それは常に有効な答えではありません. Form の新しいインスタンスを作成し、それに対して .ShowDialog() を呼び出すことによって、アプリケーションがモーダル ダイアログ ボックスを表示する場合、ユーザーがその Form を最小化するのは望ましくありません。フォームのモーダル ステータスが満たされていること。ユーザーがメイン フォームをクリックすると、Windows から「ディン ディン ディン」という無応答のサウンドが聞こえ、何をすべきかわからなくなる可能性があります。

于 2008-11-25T23:11:19.840 に答える