2015년 10월 7일 수요일

[C#,Application클래스필터링강좌]마우스클릭이벤트를필터링 시키자.IMessageFilter

[C#,Application클래스필터링강좌]마우스클릭이벤트를필터링 시키자.IMessageFilter 참조하세요,,,


C# 윈도우 프로그램은 이벤트(Event, 사건)에 반응해서 코드가 실행되는 이벤트 기반으로 맊들어지며 이러한 이벤트는 사용자가 일으키는것이 아니라 윈도우 운영체제가 일으키는 것이다.

사용자가 키보드나 마우스를 제어하면 인터럽트가 발생되고 이를 운영체제가 받아 들이는 것이고 운영체제는 이 인터럽트를 바탕으로 윈도우 메시지를 만든 뒤 이벤트를 받아야 하는 응용프로그램에 보내는 것이다.

윈도우 메시지는 종류가 다양하다. 윈도우 응용프로그램은 마우스 이동이나 클릭, 키보드 입력처럼 미리 등록되어 있는 메시지를 받지만 다른 응용프로그램은 자체적으로 정의한 메시지도 받을 수 있다.

Application클래스는 응용프로그램이 받고 있는 수많은 메시지 중 관심 있는 메시지만 걸러낼 수 있는 메시지 필터링 기능이 있다. 예를 들어 윈도우 응용프로그램에서 ALT+F4를 눌러 윈도우가 종료되는 것을 막고 싶다면 필터링 기능을 이용하여 이를 차단하는 것도 가능하다.

일반적으로 윈도우 메시지는 식별번호가 붙어 있는데 WM_LBUTTONDOWN 메시지 ID가 0x201로 정의되어 있는데 Application 클래스는 특정 ID를 갖는 메시지를 필터를 등록해 두었다가 응용프로그램에 메시지가 전달되면 해당 필터를 동작시키며 필터링 되지 않는다면 해당 메시지를 폼이나 컨트롤로 보내 이벤트를 발생시킨다.

아래 예제는 윈폼에서 마우스를 클릭하면 윈도우를 종료하는 예제인데 마우스 클릭의 윈도우 메시지(x210)을 필터링 하는 예제이다.


using System;
using System.Windows.Forms;
namespace ConsoleApplication9
{
    class OnjMessageFilter : IMessageFilter
    {
        //응용프로그램에서 받은 마우스 클릭 이벤트를 필터링 시킴 
        public bool PreFilterMessage(ref Message m)
        {       
            //마우스 클릭시 필터링 시킴  
            if (m.Msg == 0x201)
            {
                Console.WriteLine("마우스 클릭 -> 필터링됨...");
                //필터에서 처리했으니 응용프로그램에서 처리안해도된다는 의미
                //Form에 걸려 있는 Click 이벤트 동작안함.... 즉 윈도우가 종료되지않는다
                //이 부분을 false로 바꾼 후 실행해 보라
                return true;  
            }
            return false;
        }
    }

    class Program : Form
    {
        static void Main(string[] args)
        {
            Application.AddMessageFilter(new OnjMessageFilter());
            Program p = new Program();
            p.Click += new EventHandler(p.Form_Click);
            Application.Run(p);    
        }

        void Form_Click(object sender, EventArgs e)
        {
            Console.WriteLine("마우스 클릭 이벤트 발생...");
            Application.Exit();
        }
    }
}

댓글 없음:

댓글 쓰기