본문 바로가기
Programming/Tips(C++,C#)

C#에서 메시지 후킹하기

by 곰네Zip 2012. 4. 25.

C#에서 메시지를 후킹하려면 아래와 같이 해야한다.


1. 메시지를 후킹하는 클래스를 하나 선언한다.

나중에 귀찮지 않으려면 

using System.Windows.Forms; 

를 선언해준다. (클래스 선언시에 IMessageFilter를 선언해야하는데.. 저거 안쓰면 귀찮아서..; 쓸일이 있을지도 모르고 해서 난 그냥 포함함.. ㅡ,.ㅡ;)

클래스 선언시 IMessageFilter를 사용하도록 해야한다. 즉.. 생성할 클래스명이 MessageHooker라면..


class MessageHooker : IMessageFilter

{

   //something

}


이렇게 선언해주어야 함. 


2. PreFilterMessage를 구현할것. (안하면 빌드에러남)

public bool PreFilterMessage( ref Message m)

{

    if( m == 메시지 )

    {

         //to do

         return true;

    }

   else

    {

         return false;

   }

}


3. 해당 클래스를 프로그램의 메인 클래스에 추가해 준다.

만약 내가 생성한 프로젝트 이름이 MyTest라면..

class MyTest : Forms

{

         .....

        public MyTest()

        {

             Application.AddMessageFilter(new MessageHooker());

             //to do

        }

        ...

}


이러면 메시지 후킹 성공!


*P.S:

다른 방법으로는


public override void WndProc(ref Message m)

{

      if( condition )

      {

           //todo

      }

      base.WndProc( ref m);

}


이런식으로 구현해주면 된다. 근데.. WndProc과 MessageFilter와 서로 마우스 메시지 등을 인식하는 타이밍이 다르다. (이상한 설명인데.. 만약 내꺼 폼 안에 다른 컨트롤이 들어가 있으면 그 컨트롤이 먼저 메시지를 먹고 나의 폼에게 던져주느냐, 아니면 내 폼이 먼저 메시지를 먹느냐 하는 차이가 존재하는것으로 보인다. IMessageFilter를 쓰면 내 폼이 먼저 먹는것으로 보인다만 좀 더 확인해보아야할듯)

반응형

댓글