Всем привет!
Как-то кто-то интересовался как запретить closebox в titlebar. Вот привожу код, который
решает эту задачу. Сильно не оформлял и к тому же на NETе и шарпе я недавно, так что не пинайте
сильно. Ненужные фрагменты кода формы поскипаны.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
namespace DisableCloseBox2
{
// Нам понадобятся некоторые функции WinApi32
public class Win32
{
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int GetSystemMenu
(int hWnd, bool b);
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int EnableMenuItem
(int hMenu, uint uItemID, uint uEnable );
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int SetWindowPos
(int hWnd, int hWndInsAfter, int x, int y, int cx, int cy, uint Flags );
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int SendMessage
(int hWnd, uint Msg, uint wparam, uint lparam );
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int PostMessage
(int hWnd, uint Msg, uint wparam, uint lparam );
}
/// <summary>
/// Summary description for Form1.
/// </summary>
public class FormWithoutCloseBox : System.Windows.Forms.Form
{
.....................
public FormWithoutCloseBox()
{
InitializeComponent();
// Форсируем процесс запрещения пунта системного меню и кнопки [X]
ForceDisableCloseBox();
}
.....................
protected override void WndProc( ref Message m )
{
if ( m.Msg == 0x0116 || m.Msg == 0x0117 /*WM_INITMENU*/ )
{
int hMenu = m.WParam.ToInt32();
// Запрещаем пункт close системного меню и прицепом кнопку [X]
Win32.EnableMenuItem
(
hMenu, 0xF060 /*SC_CLOSE*/, 0x0000 /*MF_BYCOMMAND*/ |
0x0002 /*MF_DISABLED*/ | 0x0001 /*MF_GRAYED*/
);
// Перерисовываем кнопку [X] насильно
Win32.SetWindowPos
(
(int) Handle, (int) 0,
-1,-1,-1,-1,
0x0001 | // SWP_NOSIZE
0x0002 | // SWP_NOMOVE
0x0004 | // SWP_NOZORDER
0x0010 | // SWP_NOACTIVATE
0x0020 // !!! SWP_FRAMECHANGED !!!
);
}
if ( m.Msg == 0x0005 /*WM_SIZE*/ )
{
ForceDisableCloseBox();
}
base.WndProc( ref m );
}
void ForceDisableCloseBox()
{
// Форсируем процесс запрещения пунта системного меню и кнопки [X]
int hMenu = Win32.GetSystemMenu( (int) Handle, false );
Win32.PostMessage( (int) Handle, 0x0116 /*WM_INITMENU*/, (uint) hMenu, 0 );
}
}
}