[C#닷넷교육]윈도우종료막기(ALT+F4 키기능 막기)
꽁스짱
C#
0
1200
2021.02.15 23:06
[C#닷넷교육]윈도우종료막기(ALT+F4 키기능 막기), Applciation 클래스의 메시지 필터기능보다 간단히 구현할 수 있으니 아래 예제 참조하세요~
1. 해당 폼의 KeyPreView 속성을 true로 설정
2. 아래 이벤트 코드 작성(폼이름이 MDIMain이라고 가정)
private bool isAltF4Pressed;
private void MDIMain_FormClosing(object sender, FormClosingEventArgs e)
{
if (isAltF4Pressed)
{
if (e.CloseReason == CloseReason.UserClosing)
e.Cancel = true;
isAltF4Pressed = false;
}
}
private void MDIMain_KeyDown(object sender, KeyEventArgs e)
{
if (e.Alt && e.KeyCode == Keys.F4) isAltF4Pressed = true;
}
-------------------------------------------
다른 방법은 Application.AddMessageFiler로 만든 필터를 등록하는 방법이 있다.
먼저 필터를 만들어야 한다. 아래 코드를 참조하자.
Application 클래스의 AddMessageFilter() 메소드는 응용프로그램에 메시지 필터를 등록하며 이 메소드의 매개변수로 IMessageFilter를 구현한 클래스의 인스턴스를 매개변수로 받으며 IMessageFilter의 PreFilterMessage를 구현해야 한다.
[예제]
using System.Windows.Forms;
using System;
namespace ConsoleApplication1
{
public class Program : Form
{
static void Main()
{
Application.AddMessageFilter(new AltF4Filter()); // Add a message filter
Application.Run(new Program());
}
}
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)))
Console.WriteLine("ALT+F4 Filtering됨.");
return true; // eat it!
}
return false;
}
}
}