Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Отключить кнопку закрытия чужого окна 2

Delphi , Программа и Интерфейс , Приложения чужие

Отключить кнопку закрытия чужого окна 2


procedure TForm1.FormCreate(Sender: TObject);
var
  Style: Longint;
begin
  Style := GetWindowLong(Handle, GWL_STYLE);
  SetWindowLong(Handle, GWL_STYLE, Style and not WS_SYSMENU);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift:
  TShiftState);
begin
  if (Key = VK_F4) and (ssAlt in Shift) then
  begin
    MessageBeep(0);
    Key := 0;
  end;
end;

{ Disable close button }

procedure TForm1.Button1Click(Sender: TObject);
var
  SysMenu: HMenu;
begin
  SysMenu := GetSystemMenu(Handle, False);
  Windows.EnableMenuItem(SysMenu, SC_CLOSE, MF_DISABLED or MF_GRAYED);
end;

{ Enable close button }

procedure TForm1.Button2Click(Sender: TObject);
begin
  GetSystemMenu(Handle, True);
  Perform(WM_NCPAINT, Handle, 0);
end;

Но это окно можно закрыть из TaskBar'а.

Вы пытаетесь отключить кнопку закрытия формы в вашем приложении Delphi, чтобы она не могла быть закрыта кликом по кнопке или нажатием Alt+F4.

Для достижения этого вы используете различные функции и константы Windows API, что здорово! Однако, как вы заметили, форма все еще может быть закрыта из панели задач.

Чтобы полностью отключить закрытие формы с помощью всех возможных способов, вам нужно использовать дополнительные техники. Вот несколько предложений:

  1. Изменение стиля окна: В процедуре FormCreate вы уже настраиваете стиль окна с помощью SetWindowLong. Вы можете также настроить стиль WS_EX_TOOLWINDOW, чтобы предотвратить перемещение или закрытие окна пользователем.
Style := Style and not WS_SYSMENU;
SetWindowLong(Handle, GWL_STYLE, Style);
SetWindowEx(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
  1. Переопределение сообщения WM_SYSCOMMAND: Это важный шаг. Когда пользователь нажимает Alt+F4 или кликает по кнопке закрытия, Windows отправляет сообщение WM_SYSCOMMAND в вашу форму. Вы можете переопределить это сообщение в обработчике событий формы, чтобы предотвратить закрытие формы.
procedure TForm1.WMSysCommand(var Msg: TMessage);
begin
  if (Msg.Msg = SC_CLOSE) or (Msg.Msg = SC_TASKLIST) then
    Result := False; // не закрывайте форму
end;
  1. Отключение кнопки панели задач: Хотя вы не можете полностью отключить кнопку панели задач, вы можете сделать ее невидимой, настроив стиль TBMUTTON на TBBS_INVISIBLE.
procedure TForm1.FormCreate(Sender: TObject);
begin
  // ... (другой код)
  TTaskbarList.AddButtons(Handle, [TBBS_INVISIBLE]);
end;
  1. Мониторинг сообщений окна: Вы также можете использовать функцию Windows.PumpMessage для мониторинга сообщений окна и отмены любых попыток закрыть вашу форму.
procedure TForm1.WndProc(var Msg: TMessage);
begin
  if (Msg.Msg = WM_CLOSE) or (Msg.Msg = SC_CLOSE) then
    Result := False; // не закрывайте форму
end;

Обратите внимание, что эти техники могут иметь некоторые ограничения и побочные эффекты. Например, отключение кнопки панели задач не будет предотвращать закрытие формы с помощью других методов (например, нажатием Ctrl+F4).

Надеюсь, это поможет вам достичь вашей цели!

Отключение кнопки закрытия чужого окна на Delphi позволяет предотвратить закрытие формы с помощью клавиши Alt + F4, но не исключает возможность закрытия формы из панели задач.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Приложения чужие ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 16:50:05/0.0018589496612549/0