Запрещаем closebox на C#
От: МихаилС Россия  
Дата: 27.11.02 16:28
Оценка:
Всем привет!

Как-то кто-то интересовался как запретить 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 );
    }
  }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.