как отключить alt + F4 для приложения?

Как я могу отключить использованиеALT +F4 для всего приложения для приложений C #?

В моем приложении много WinForms, и я хочу отключить возможность закрытия форм с помощьюALT +F4, Пользователи должны иметь возможность закрыть форму, используя «X» формы, хотя.

Опять же, это не только для одной формы. Я ищу способ такALT +F4 отключен для всего приложения и не будет работать ни для одной формы. Является ли это возможным?

 JonH15 окт. 2012 г., 17:25
@MChicago - тогда используйте "Возможно дублирование ссылка размещена CodeIgnoto в верхней части этих комментариев.
 JonH15 окт. 2012 г., 17:34
@AllonGuralnek -Give a man a fish and you feed him for a day. Teach a man to fish and you feed him for a lifetime. хорошая вещь в stackoverflow - вы можете проголосовать за повторное открытие. Используйте то, что есть, если вы считаете, что можете помочь с решением, которое для меня уже существует и требует совсем немного усилий, чем не стесняйтесь вновь открыть и предоставить решение.
 Simon Mourier15 окт. 2012 г., 17:35
Я нене думаю, что этоточный повторяющийся вопрос. Я проголосовал за повторное открытие.
 Allon Guralnek15 окт. 2012 г., 17:31
@JonH: самая важная часть кода - это та,Не знаю, как писать, по крайней мере, для вопроса. Пожалуйста, уважайтеих проблема.
 mchicago15 окт. 2012 г., 17:47
@JonH То, что я ожидал, было решением, где alt + F4 может быть обнаружен и отфильтрован в AppDomain.цикл сообщений еще до того, как WinForm его получит. Но прежде чем что-то делать, я хотел получить экспертасовет Спасибо Джону сейчасЧеловек научится ловить рыбу сам (без стека-переполнения), Я все еще верю, что это не повторяющийся вопрос, но я потрачу свои силы на поиск решения, а не на споры по поводу переполнения стека.
 Allon Guralnek15 окт. 2012 г., 17:26
Я неЯ думаю, что этот вопрос является дубликатом, потому что он требует способа сделать это глобально для всего приложения, а не для каждой отдельной формы.
 JonH15 окт. 2012 г., 17:22
Вау, возможный дубликат был точным для человека, который ответил на него, а затем внезапно удалил его. Shady!
 JonH15 окт. 2012 г., 17:27
@AllonGuralnek - Ответ все тот же, вы можете реализовать этот код в глобальной функции / классе и повторно использовать его во всех формах.
 mchicago15 окт. 2012 г., 17:31
@JonH Я понимаю, что ты говоришь. Но я хотел сохранить это поведение в библиотеке глобальных ключей, которую я создал, вместо того, чтобы хранить логику alt + f4 в клиентском приложении, которое использует dll. Потому что в будущем может появиться много торговых приложений, которые будут использовать созданную мной глобальную библиотеку горячих клавиш.
 JonH15 окт. 2012 г., 17:48
@MChicago - вы можете проголосовать, чтобы открыть заново, я нене вижу проблемы с этим.
 mchicago15 окт. 2012 г., 17:32
@AllonGuralnek Спасибо, сэр, за понимание реальной проблемы. Наверняка это не дублируется.
 JonH15 окт. 2012 г., 17:28
@MChicago - Нет, вы повторно используете код во всех ваших формах, внедряете один раз и повторно используете в своем приложении.
 JonH15 окт. 2012 г., 17:23
Вау, а затем редактировать его:I would recommend doing the following:@Daniel, пожалуйста, прекратите копировать и вставлять ответы других, принимая кредит. Пометьте закрытый вопрос как дубликат и найдите более подходящее времяпрепровождение.
 JonH15 окт. 2012 г., 17:30
@AllonGuralnek - Вы не переписываете самый важный фрагмент кода, то есть все детали, которые находятся в "дублировать» ссылка на этот пост.
 mchicago15 окт. 2012 г., 17:27
@JonH это не повторяющийся вопрос. Потому что другой вопрос решает проблему только для одной формы win. Что делать, если у меня есть 50 форм в одном приложении. Должен ли я реализовать эту логику для всех 50 форм? Я надеялся на решение, где мы можем переопределить WndProc и отфильтровать alt + F4 прямо здесь.
 mchicago15 окт. 2012 г., 17:24
У меня есть приложение, в котором пользователь может зарегистрировать горячую клавишу, и после ее нажатия будет выполнена присоединенная логика. Раньше мы использовали стороннюю библиотеку, в которой управление горячими клавишами было заключено внутри библиотеки. И пользователь смог использовать ALT + F4 в качестве действующей горячей клавиши. Но теперь я заменяю эту стороннюю библиотеку своей собственной DLL. Другие функциональные возможности горячих клавиш сделаны за исключением этой части, где не закрывайте форму на alt + f4 и не позволяйте ей быть действительной горячей клавишей. Так что у меня нет выбора, кроме как вести себя одинаково.
 Ian15 окт. 2012 г., 17:21
Вы должны задать себе вопрос - почему вы хотите удалить этот стандартный способ закрытия диалогов? Вы'Нарушение соглашения и для этого нужна очень веская причина - проверьте обмен стеками пользовательского опыта.
 Allon Guralnek15 окт. 2012 г., 18:05
@MChicago: Пожалуйста, отредактируйте свой вопрос (и название вопроса), чтобы отразить уникальность вашего вопроса и почемуне дубликат (подчеркивая, что проблемы, которые необходимо решить, это глобализация функциональности). Также включите свои размышления о подходе к проблеме, это прояснит вопрос и даст людям представление. К сожалению я неУ меня нет решения.
 Allon Guralnek15 окт. 2012 г., 17:29
@JonH: Это небыть очень глобальным, если вам приходилось писать код в каждой форме снова и снова. Может быть, создалForm базовый класс, который включает в себя эту функциональность, или, возможно, перечислитьApplication.OpenForms собирать и прикреплять это поведение динамически. В любом случае я верюГлобальный Решение само по себе заслуживает ответа, даже если онона основе существующего ответа, указанного выше. Суть вопроса в том,КАК повторно использовать код, указанный в связанном ответе, во всехFormс, который 'Т ответил в этом ответе.

Ответы на вопрос(1)

Решение Вопроса

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.AddMessageFilter(new AltF4Filter()); // Add a message filter
            Application.Run(new Form1());
        }
    }

    public class AltF4Filter : IMessageFilter
    {
        public bool PreFilterMessage(ref Message m)
        {
            const int WM_SYSKEYDOWN = 0x0104;
            if (m.Msg == WM_SYSKEYDOWN)
            {
                bool alt = ((int)m.LParam & 0x20000000) != 0;
                if (alt && (m.WParam == new IntPtr((int)Keys.F4)))
                return true; // eat it!                
            }
            return false;
        }
    }
}
 Simon Mourier03 мар. 2015 г., 11:41
@DreamerXD - задать другой вопрос
 Dreamer XD03 мар. 2015 г., 09:16
Здравствуйте @SimonMourier, как я могу отключить CTRL-ALT-DEL, ALT-TAB и меню "Пуск" Спасибо.
 Allon Guralnek16 окт. 2012 г., 10:49
Теперь это'отлично!
 Allon Guralnek15 окт. 2012 г., 18:33
Тот'Это интересное решение. Что делать, если сообщение обрабатывается поздно (из-за задержки) иControl.ModifierKeys больше не сообщает, чтоCtrl прижал (пропустил)?
 mchicago15 окт. 2012 г., 19:21
спасибо за решение. Я искал что-то вроде этого. Кстати, наряду с alt + F4 он также отфильтровывает alt + shift + F4. Просто чтобы вы знали.
 Simon Mourier15 окт. 2012 г., 21:12
@AllonGuralnek - Хм ... Я вижу, у нас разборчивая аудитория :-) Я обновил свой ответ, чтобы использовать lParam '29-й бит вместо Control.ModifierKeys.

Ваш ответ на вопрос