Как отменить alt+f4 ?

Нужно заблокировать возможность случайного закрытия формы. В Turbo Pascal я знаю как это сделать, но в PascalABC.NET понятия не имею …

{$reference PresentationCore.dll}
{$reference PresentationFramework.dll}

{$apptype windows}

uses System.Windows;

begin
  var w := new Window;
  
  w.Closing += (o,e)->
  begin
    e.Cancel := true;
  end;
  
  Application.Create.Run(w);
end.
1 лайк

Спасибо. А есть иные способы?

Иные это какие? Если решение чем то не подходит - это скорее всего значит что вы не достаточно подробно описали свою задачу.

Я не знаю… Например как в Turbo Pascal отключить флаг нажатия (эмитировать что клавиша не нажата) или как нибудь перехватить её … (Задачи чёткой не стоит)

“Доктор… хочется чего-то странного…”

Ну дык моя программа как раз и занимается перехватом системного сообщения закрытия окна (точнее есть несколько типов сообщений закрытия окна, узнать какое можно из свойств e).

Но это не важно, вы можете хотя бы сформулировать зачем вам другой вариант?

Мне хотелось бы код который можно было бы адаптировать и под другие сочетания клавиш win+r, win+g, alt+tab, и т.д. . Извините за то, что я задал такой не конкретный вопрос.

Закрывание окна нормально отменять, но только в случаях вроде “кнопка закрыть” >> “сохранить файл xxx?” >> “отменить и продолжить редактировать”.

А системные команды как те что вы назвали - нельзя отменять. Это может понадобится или если вы пишете вирус, или если вы придумали сделать UI, который будет очень больно использовать.

Системные команды как win+r созданы специально чтоб работать всегда, даже если система подвисает и т.п.

Я просто хотел игру написать которая создаёт видимость того что она всё понимает и она играет с игроком… Между тем как в ваш код подключить GraphWPF?

К GraphWPF это никак не прикрутить. Там есть ивент вызываемый прямо перед закрытием окна, но там отменить закрытие не выйдет.

А для игры которая понимает что нажимает пользователь - не обязательно что то перехватывать. Можно узнавать список глобальных (не зависимых от окна) нажатых клавиш через WinAPI вроде GetKeyState. Гуглите описание на сайте майкрасофта. Подключайте с помощью external, он описан в справке данного паскаля.

Ну, если очень надо - можно закопаться в неприкосаемые кишки GraphWPF:

uses GraphWPF, GraphWPFBase;

begin
  GraphWPFBase.MainWindow.Closing += (o,e)->
  begin
    e.Cancel := true;
  end;
end.

Но вообще это плохо. Надо, хотя бы, засунуть этот код в отдельный модуль, чтоб не подключать GraphWPFBase к основной программе.

Большое спасибо^^