Домой WINAPI Блокируем/разблокируем копку закрытия : Справочник по C#

Блокируем/разблокируем копку закрытия : Справочник по C#

512
0


      Был уже пост на эту тему(см. тут), но там возникала проблема, что кнопка «закрытия» блокировалась сразу при открытии формы и разблокировать ее уже было нельзя! Данный код предлагает вам возможность выбора! Можете заблокировать кнопку «закрытия» при необходимости, а можете в нужный момент снять блокировку!

Для работы нам понадобится подключить следующие пространства имен:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

Ну и сам класс блокировки/разблокировании:

class FormEnabled
{
private const int SC_CLOSE = 0xF060;
private const int MF_GRAYED = 0x1;
internal const int MF_ENABLED = 0x0;
[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
private static extern int EnableMenuItem(IntPtr hMenu, int wIDEnableItem, int wEnable);
[DllImport("user32.dll")]
public static extern int RemoveMenu(int systemMenu, int itemPosition, int flag);
[DllImport("user32.dll")]
public static extern int GetMenuItemCount(int systemMenu);
[DllImport("user32.dll")]
public static extern int DrawMenuBar(IntPtr currentWindow);
public void FormCloseEnabled(Form form, bool enabled)
{
MethodInvoker method = delegate
{
int disable = 2;
int enable = 1;
IntPtr menu;
int itemCount;
if (enabled)
{
EnableMenuItem(GetSystemMenu(form.Handle, false), SC_CLOSE, MF_ENABLED);
//get the system menu of the application
menu = GetSystemMenu(form.Handle, false);
//get the count of menu items in the system menu
itemCount = GetMenuItemCount(menu.ToInt32());
//disable the "Close" command in the menu
RemoveMenu(menu.ToInt32(), itemCount - 1, enable);
//now draw the menu bar on the application
DrawMenuBar(form.Handle);
}
else
{
EnableMenuItem(GetSystemMenu(form.Handle, false), SC_CLOSE, MF_GRAYED);
//get the system menu of the application
menu = GetSystemMenu(form.Handle, false);
//get the count of menu items in the system menu
itemCount = GetMenuItemCount(menu.ToInt32());
//disable the "Close" command in the menu
RemoveMenu(menu.ToInt32(), itemCount - 1, disable);
//now draw the menu bar on the application
DrawMenuBar(form.Handle);
}
};

if (form.InvokeRequired)
form.BeginInvoke(method);
else
method.Invoke();
}
}

Пример использования класса:

FormEnabled fe;
public Form1()
{
InitializeComponent();
fe = new FormEnabled();
}
private void button1_Click(object sender, System.EventArgs e)
{
fe.FormCloseEnabled(this, true);//Разрешаем кнопку "Закрытия"
}
private void button2_Click(object sender, System.EventArgs e)
{
fe.FormCloseEnabled(this, false);//Запрещаем кнопку "Закрытия"
}

ВНИМАНИЕ!
Данный код не блокирует сочетание клавиш «ALT»+»F4». Как реализовать эту блокировку можете посмотреть тут.

ЧИТАТЬ ТАКЖЕ:  Читаем текст заголовков окон запущенных приложений в Windows: Справочник по C#

Исходник скачиваем тут: http://csharpcoderr.rusfolder.net/files/38306936

Блокируем/разблокируем копку закрытия : Справочник по C#

0.00 (0%) 0 votes

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь