문제

내 애플리케이션에서 기본 양식의 최소화 버튼을 일시적으로 회색으로 표시해야 합니다.이것이 어떻게 달성될 수 있는지 어떤 아이디어가 있습니까?Win32 dll에 대한 p/invoke를 수행해도 괜찮습니다.

편집하다:최소화 버튼을 회색으로 표시하는 것이 선호되는 해결 방법이지만 양식이 최소화되는 것을 방지할 수 있는 다른 방법이 있습니까?

도움이 되었습니까?

해결책

나는 나의 응답과 관련하여 당신의 의견을 읽었으며 당신을 위해 더 완전한 솔루션을 강화할 수있었습니다. 나는 이것을 빨리 달렸고 당신이 원하는 행동을하는 것처럼 보였다. 양식에서 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;

최소화 상자 = false; 양식의 코드에서.

이 코드를 양식 크기 조정 이벤트에 넣으십시오.

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

이렇게하면 양식을 상각 할 수 없게 만듭니다 (면책 조항 : 이런 식으로 창의 표준 동작을 변경하는 것을 옹호하지 않습니다).

또한 명령을 취소하기 위해 최소화 이벤트에 대한 핸들을 구현할 수도 있습니다.

하지 않다. 내 창문을 엉망으로 만들지 마십시오. 그들은 당신이 아니라 내 것입니다. 그것은 내 컴퓨터이고 최소화하고 싶다면 할 수 있어야합니다. 나는 이것을하는 좋은 이유를 생각할 수없고 결코 주어지지 않았다.

코인코인의 답변이 맞습니다.MinimizeBox는 디자이너 속성 창에서도 속성으로 사용할 수 있습니다.

@케빈:그 감정에는 감사하지만 그것이 항상 유효한 대답은 아닙니다.응용 프로그램이 Form의 새 인스턴스를 만든 다음 .ShowDialog()를 호출하여 모달 대화 상자를 표시하는 경우 사용자가 해당 Form을 최소화하는 것을 원하지 않을 것입니다. 왜냐하면 기본 UI 스레드의 모든 입력이 다음까지 차단되기 때문입니다. 해당 양식의 모달 상태가 충족되었습니다.사용자는 잠재적으로 기본 양식을 클릭하고 Windows에서 응답하지 않는 "딩딩딩" 소리를 듣고 무엇을 해야 할지 모를 수 있습니다.

양식의 최소화 상자 속성을 False로 설정하십시오. 이렇게하면 최소화 버튼이 비활성화되지만 다른 버튼은 기능적으로 유지됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top