做了個小系統,開了視窗之後要自己按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關閉」視窗的功能了
只是個路過的新手,發文有誤請告知。