Отключить кнопку "Закрыть", не скрывая панель управления
У меня есть приложение, в котором я не хочу, чтобы пользователь мог закрыть форму. Ладно, достаточно просто. Просто установите ControlBox = false
для формы.
Тем не менее, я хотел бы сохранить значок приложения в верхнем левом углу формы. Незначительное, я знаю, но детали что-то значат для меня.
Настройка Controlbox = false
также убирает значок приложения в верхнем левом углу формы. Это можно обойти??
2 ответа
Вот код, который я использовал.
Моя версия VB.Net.
Private Const CP_NOCLOSE_BUTTON As Integer = &H200
Protected Overrides ReadOnly Property CreateParams() As Windows.Forms.CreateParams
Get
Dim mdiCp As Windows.Forms.CreateParams = MyBase.CreateParams
mdiCp.ClassStyle = mdiCp.ClassStyle Or CP_NOCLOSE_BUTTON
Return mdiCp
End Get
End Property
Мне нужна была опция, которая отключала бы условное закрытие (как стандарт MessageBox
делает для YesNo
вопрос), поэтому принятый ответ не будет работать для меня, или, возможно, я не смог понять, как я мог заставить его работать. Я закончил с этим
Private Const MF_BYPOSITION As Int32 = &H400
Private Const MF_REMOVE As Int32 = &H1000
Private Declare Auto Function GetSystemMenu Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal bRevert As Int32) As IntPtr
Private Declare Auto Function GetMenuItemCount Lib "user32.dll" (ByVal hMenu As IntPtr) As Int32
Private Declare Function DrawMenuBar Lib "user32.dll" (ByVal hwnd As IntPtr) As Boolean
Private Declare Auto Function RemoveMenu Lib "user32.dll" (ByVal hMenu As IntPtr, ByVal nPosition As Int32, ByVal wFlags As Int32) As Int32
Public Sub DisableCloseButton(ByVal hwnd As IntPtr)
Dim hMenu As IntPtr, n As Int32
hMenu = GetSystemMenu(hwnd, 0)
If Not hMenu.Equals(IntPtr.Zero) Then
n = GetMenuItemCount(hMenu)
If n > 0 Then
RemoveMenu(hMenu, n - 1, MF_BYPOSITION Or MF_REMOVE)
RemoveMenu(hMenu, n - 2, MF_BYPOSITION Or MF_REMOVE)
DrawMenuBar(hwnd)
End If
End If
End Sub
Позвоните через
DisableCloseButton(MyForm.Handle)
Поскольку я использовал его для настраиваемого окна сообщения, я не проверял, как включить его снова.