C# IMessageFIlter

Featured image

Git Source


안녕하세요. chanos입니다. 😉

오늘은 C#의 IMessageFilter Interface에 대한 글입니다.

Application에서 Windows Message를 처리해야할 때 사용할 수 있는 것이 IMessageFilter 입니다.

IMessageFilter는 PreFilterMessage를 구현해야하며 매개변수로는 struct 타입으로 Windows Message를 받습니다.

리턴 타입으로는 bool 타입이 사용되는데 이 값은 MessageFilter에서 처리한 Message를 Application에 보낼건지 대한 값입니다.

IMessageFilter 구현 및 사용

구현

internal class CustomMessageFilter : IMessageFilter
{
    private ListBox ListBox { get; set; }

    public CustomMessageFilter(ListBox listBox)
    {
        this.ListBox = listBox;
    }

    public bool PreFilterMessage(ref Message m)
    {        
        if (m.Msg == 0x201)
        {
            ListBox.Items.Add($"선 처리!! | {m}");
            // return true;
        }

        return false;
    }
}

사용

private IMessageFilter Filter { get; set; }

public Form1()
{
    InitializeComponent();
    Filter = new CustomMessageFilter(this.listBox1);
    Application.AddMessageFilter(Filter);
    //Application.RemoveMessageFilter(Filter);
}

결과

result


결과를 확인하면 Application에서 버튼을 클릭하기 전 마우스 클릭 이벤트가 먼저 Filter에서 처리된 것을 확인할 수 있습니다.

여기서 만약 PreFilterMessage 메서드에서 true로 리턴을 했다면 버튼 클릭에 대한 이벤트는 발생하지 않을 것 입니다.

Applicaion의 클래스 메서드인 AddMessageFilter를 사용했기 때문에 프로세스가 끝나기 전까지 모든 폼에 대해서 Filter가 적용이 됩니다.

Filter가 더 이상 필요가 없거나 특정 폼에서는 사용하지 않는다고하면 RemoveMessageFilter를 이용해 Filter를 해제 할 수 있습니다.


Reference

IMessageFilter Interface

한빛미디어 C# 메시지 처리