Как удалить кнопку «Закрыть» из системного меню формы в C#

C# не имеет встроенного способа управления системным меню, которое появляется, когда вы нажимаете левый верхний угол формы, но не сложно использовать функции API для удаления некоторых или всех этих кнопок.

В этом примере используются следующие операторы, чтобы объявить функции API, необходимые для удаления команды X из меню.

using System.Runtime.InteropServices;
...
// Объявляем константы и методы User32.
private const int MF_BYPOSITION = 0x400;

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

[DllImport("User32")]
private static extern int
    GetMenuItemCount(IntPtr hWnd);

[DllImport("User32")]
private static extern int
    RemoveMenu(IntPtr hMenu, int nPosition, int wFlags);

// Удалите кнопку X.
private void Form1_Load(object sender, EventArgs e)
{
    IntPtr hMenu = GetSystemMenu(this.Handle, false);
    int num_menu_items = GetMenuItemCount(hMenu);
    RemoveMenu(hMenu, num_menu_items - 1, MF_BYPOSITION);
    RemoveMenu(hMenu, num_menu_items - 2, MF_BYPOSITION);
}

Этот код сначала определяет функции API GetSystemMenu, GetMenuItemCount и RemoveMenu.

Обработчик события Load формы использует GetSystemMenu, чтобы получить дескриптор для системного меню формы. Затем он использует GetMenuItemCount, чтобы узнать, сколько элементов содержится в меню. Затем он дважды вызывает RemoveMenu, чтобы удалить элемент меню «Закрыть» и разделитель, который находится перед ним в меню.

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

Обратите внимание, что код сначала удаляет последний элемент меню, а затем удаляет второй второй элемент. Если он сначала попытался удалить второй-последний элемент, тогда в меню будет один элемент, когда код попытается удалить последний элемент, чтобы он не работал. Код должен удалять только те позиции, которые существуют в то время.

Если вы удалите все элементы меню системы, пользователь не сможет перемещать, изменять размер или закрывать форму, и системное меню формы не будет отображаться. Однако символ системного меню по-прежнему отображается в верхнем левом углу формы, курсор все равно изменяется на курсор изменения размера, когда вы удерживаете его над границами формы, и кнопки с минимальным и максимальным значениями все еще работают. В целом, это довольно запутанно для пользователя. Если вы хотите полностью удалить это меню, установите для него свойство ControlBox вместо False.

Источник: http://csharphelper.com/blog/2016/09/remove-the-close-button-from-a-forms-system-menu-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector