全局性的Esc關閉當前視窗的設定

做了個小系統,開了視窗之後要自己按X很麻煩,如果要一個一個視窗去設置Esc關閉視窗又好懶,有十來個要弄欸!

所以就寫了個Class,用全局性的消息過濾來達成。

先在隨便一個類別.cs內建置我們的class,接著使用下面的程式碼,再到Program內引用它。

記得namespace要跟你的程式相同,如果不相同的話,後續的引用你要加上using。

比如我的這個類別會到處引用,所以namespace命名為Tool,那我後續如果要在Program內使用的時候就要先using Tool;否則會出現錯誤。

public class GlobalKeyMessageFilter : IMessageFilter
    {
        public bool PreFilterMessage(ref Message m)
        {
            if (m.Msg == 0x0100) // WM_KEYDOWN 消息
            {
                Keys key = (Keys)m.WParam.ToInt32() & Keys.KeyCode;
                if (key == Keys.Escape)
                {
                    if (Application.OpenForms.Count > 1)//這邊因為我不想要整個主程式被Esc關閉,所以過濾掉
                    {
                        Form activeForm = Form.ActiveForm;
                        if (activeForm != null && !activeForm.Modal && activeForm.Name != "Form_Main")//這邊因為Program進來的時候我的主要視窗是Form_Login,後面常駐的視窗是Form_Main,所以也過濾掉不可以Esc關閉
                        {
                            activeForm.Close();
                            return true; 
                        }
                    }
                }
            }
            return false;
        }
    }

在Program引用的方法:

    static class Program
    {
        /// <summary>
        /// 應用程式的主要進入點。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            // 添加全局消息過濾器
            Application.AddMessageFilter(new GlobalKeyMessageFilter());
            Application.Run(new Form_Login());
        }
    }

如此就能達成懶人設置每個視窗(除了主體外)全都可以使用「按下Esc關閉」視窗的功能了

只是個路過的新手,發文有誤請告知。