Нужно заблокировать возможность случайного закрытия формы. В 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.
Спасибо. А есть иные способы?
Иные это какие? Если решение чем то не подходит - это скорее всего значит что вы не достаточно подробно описали свою задачу.
Я не знаю… Например как в 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
к основной программе.
Большое спасибо^^