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를 쓰면 내 폼이 먼저 먹는것으로 보인다만 좀 더 확인해보아야할듯)
댓글