2016년 9월 12일 월요일

[C#학원,닷넷학원추천★탑크리에듀][C#닷넷교육]윈도우종료막기(ALT+F4 키기능 막기)

[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;
        }
    }
}

댓글 없음:

댓글 쓰기