Как удалить кнопку «Закрыть» из системного меню формы в 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.