Отключить кнопку выхода в форме окна? - PullRequest
3 голосов
/ 26 марта 2009

Есть ли способ отключить кнопку выхода в форме Windows без необходимости импортировать некоторые внешние .dll? Я отключаю кнопку выхода, импортируя DLL, используя следующий код, но мне это не нравится. Есть ли более простой (встроенный) способ?

    public Form1()
    {
        InitializeComponent();
        hMenu = GetSystemMenu(this.Handle, false);
    }

    private const uint SC_CLOSE = 0xf060;
    private const uint MF_GRAYED = 0x01;
    private IntPtr hMenu;

    [DllImport("user32.dll")]
    private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

    [DllImport("user32.dll")]
    private static extern int EnableMenuItem(IntPtr hMenu, uint wIDEnableItem, uint wEnable);

    // handle the form's Paint and Resize events 

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        EnableMenuItem(hMenu, SC_CLOSE, MF_GRAYED);
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        EnableMenuItem(hMenu, SC_CLOSE, MF_GRAYED);
    }

Ответы [ 7 ]

5 голосов
/ 16 сентября 2012

Чтобы отключить кнопку закрытия в форме, просто напишите приведенный ниже код в событии закрытия формы.

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        e.Cancel = true;
    }
5 голосов
/ 26 марта 2009

Вы не можете легко отключить кнопку выхода (в правом верхнем углу, которая закрывает форму).

Однако вы можете полностью скрыть кнопку, установив для свойства ControlBox значение false.

ControlBox можно включать и выключать в любое время, поэтому вы можете использовать это, если хотите динамически разрешать закрытие в некоторые моменты, а не в другие.

Кроме того, вы можете обработать событие FormClosing и отменить закрытие, если выберете.

Вот демонстрация.

Создание нового проекта Windows Forms.

Удалите элемент управления CheckBox на форму с текстом «ControlBox». Подключите событие Click к этому:

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    ControlBox = checkBox1.Checked;
}

Затем перетащите второй элемент управления CheckBox на форму с текстом «Отмена Закрыть». Подключите событие FormClosing формы к этому:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = checkBox2.Checked;
}

Запустите приложение и начните играть с флажками. Скоро вы увидите, как все работает.

4 голосов
/ 26 марта 2009

Немного ковыряясь, нашел этот удобный класс помощника:

Отключить кнопку закрытия и предотвратить перемещение формы (версия C #)

Это на самом деле делает больше, чем вы ищете, но, по сути, делает это почти так же, как вы делаете в своем примере кода. Вспомогательный класс подключается к событиям загрузки / изменения размера, поэтому вам не нужно забывать делать это самостоятельно.

3 голосов
/ 26 марта 2009

Да.

Установка формы. ControlLox = false скрывает кнопку закрытия. Хотя, это также скроет кнопку сворачивания и максимизации.

Вы также можете установить form.FormBorderStyle = FormBorderStyle.None, который будет скрывать всю строку заголовка.

Если вы хотите показать кнопку X, но просто остановить закрытие формы, переопределите OnClosing и установите для свойства e.Cancel значение true.

2 голосов
/ 26 марта 2009

Перехватить событие FormClosing и отменить его в аргументах.

1 голос
/ 26 марта 2009

Используя visual studio, выберите форму, перейдите в свойства и установите для свойства ControlBox значение false или попробуйте this.ControlBox = false; или frmMainForm.ControlBox = false;

0 голосов
/ 08 декабря 2016

Отключение кнопки возможно без импорта DLL. ControlBox = false заставляет кнопки минимизации и максимизации и границы исчезать, и это не отключает кнопку закрытия 'X' - она ​​скрывается. Это решение отключает его:

private const int CP_NOCLOSE_BUTTON = 0x200;
protected override CreateParams CreateParams
{
    get
    {
       CreateParams myCp = base.CreateParams;
       myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON ;
       return myCp;
    }
}

Источник: https://www.codeproject.com/kb/cs/disableclose.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...