전체 : 4,150,784 명
어제 : 0 명
오늘 : 0 명

IMessage Filter를 상속하여 어플리케이션 단위의 메시지 후킹.

Juma | 2009.09.27 13:57 | 조회 6657

IMessageFilter를 구현하고

자신의 Application으로 수신되는 Window Message를 Hooking하는 과정을

간단하게 테스트 해보았습니다.

우선 MessageFilter를 상속하여 구현합니다.

윈도우 메시지가 어플리케이션의 각각의 컨트롤핸들에 전달되는 과정중

일부분에 끼어들어 동작 됩니다.

자세한 설명은 소스에 주석을 달아 설명하겠습니다.

Source -- SubclassingTest.zip

'MessageFilter.vb 소스 ================================================== 메시지 필터 구현

Namespace msgFilter
Public Class MessageFilter
Implements System.Windows.Forms.IMessageFilter

'인터페이스 구현을 선언합니다.

Private Shared m_DebugTextBox As TextBox

'디버그 코드를 출력할 TextBox.

Public Delegate Sub RaiseWindowMessage_Delegate(ByVal WM As WindowMessage)

'자신이 원하는 메시지를 필터링 한후 이벤트를 발생시키기 위한 대리자
Public Event RaiseWindowMessage As RaiseWindowMessage_Delegate

'자신이 원하는 메시지를 필터링 한후 이벤트를 발생시키기 위한 이벤트

Public Sub SetRefToTextBox(ByRef SetTextBox As System.Windows.Forms.TextBox)

'텍스트 박스의 레퍼런스를 받아 공용 변수에 저장.
m_DebugTextBox = SetTextBox
End Sub

Public Shared Sub Debug_Output(ByVal Msg As String)
If MessageFilter.m_DebugTextBox IsNot Nothing Then

'지정된 디버그 출력 텍스트 박스가 있을 경우.
MessageFilter.m_DebugTextBox.Text = Msg & vbCrLf & MessageFilter.m_DebugTextBox.Text

'전달 받은 내용을 텍스트 박스에 출력.
End If
End Sub


Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean _
Implements System.Windows.Forms.IMessageFilter.PreFilterMessage

'System.Windows.Forms.IMessageFilter.PreFilterMessage의 구현
Select Case m.Msg

'메시지 분류를 통하여 원하는 메시지를 필터링
Case WindowMessage.WM_KEYDOWN

'키다운일때 메시지
RaiseEvent RaiseWindowMessage(WindowMessage.WM_KEYDOWN)

'필터링된 메시지를 이벤트로 전달.
MessageFilter.Debug_Output("PreFilterMessage : KEYDOWN HANDLE : " & CStr(m.HWnd))

'메시지 로그 출력
Case WindowMessage.WM_MOUSEMOVE

'마우스 무브 . 동작하지 않도록 하였음.
'RaiseEvent RaiseWindowMessage(WindowMessage.WM_MOUSEMOVE)
Case WindowMessage.WM_LBUTTONDOWN

'마우스 왼쪽 버튼 다운
RaiseEvent RaiseWindowMessage(WindowMessage.WM_LBUTTONDOWN)
MessageFilter.Debug_Output("PreFilterMessage : LBUTTONDOWN HANDLE : " & CStr(m.HWnd))
Case WindowMessage.WM_RBUTTONDOWN

'마우스 오른쪽 버튼 다운
RaiseEvent RaiseWindowMessage(WindowMessage.WM_RBUTTONDOWN)
MessageFilter.Debug_Output("PreFilterMessage : RBUTTONDOWN HANDLE : " & CStr(m.HWnd))
Case Else

'그외는 무시.
End Select
End Function

Public Enum WindowMessage As Integer

'메시지 상수에 대한 추가 적인 메시지 상수는

'C:Program FilesMicrosoft Visual Studio 8VCPlatformSDKIncludewinuser.h

'파일을 보면 WM_로 시작하는 상수들을 통해 알수 있다.
WM_KEYDOWN = &H100
WM_MOUSEMOVE = &H200
WM_LBUTTONDOWN = &H201
WM_RBUTTONDOWN = &H204
End Enum
End Class
End Namespace

'Form1.vb 소스 ======================================================= 메인창.

Public Class Form1

Private MyMF As New msgFilter.MessageFilter

'인스턴스 메시지 필터 정의.
Private Shared IsMessageFilterSetup As Boolean = False

'메시지 필터를 1번만 정의하기 위한 플래그.

Public Sub New()

' 이 호출은 Windows Form 디자이너에 필요합니다.
InitializeComponent()

' InitializeComponent() 호출 뒤에 초기화 코드를 추가하십시오.


If Not Form1.IsMessageFilterSetup Then

'처음 실행시 IsMessageFilterSetup 값은 False이며 이때 실행.
Form1.IsMessageFilterSetup = True

'처음 실행후 IsMessageFilterSetup 값을 True로 바뀌며

'공용 변수이기 때문에 모든 인스턴스가 같은값을 참조하여

'하위창이 실행되어도 이부분은 실행되지 않음.
MyMF.SetRefToTextBox(Me.TextBox1)

'디버그 코드가 출력될 TextBox 레퍼런스 전달.
System.Windows.Forms.Application.AddMessageFilter(MyMF)

'인스턴스 메시지 필터를 등록.
End If


For i As Integer = 0 To 100
Me.DataGridView1.Rows.Add("test" & i)
Next i
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim tmp As New Form1()
tmp.Show(Me)

'하위창 출력.
End Sub
End Class

twitter facebook me2day 요즘
Thank
Thank
08.01 01:48 | Cless님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
좋은 자료 감사합니다

좋은 자료 감사합니다

12.10 19:26 | 곰탱이_님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
감사요
감사요
12.23 01:43 | kane0202님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
댓글쓰기 - 로그인한 후 댓글작성권한이 있을 경우 이용하실 수 있습니다.

비밀번호 확인

댓글 등록시에 입력했던 비밀번호를 입력해 주세요.
72개(1/4페이지)
rss
비주얼베이직
번호 제목 작성자 작성일 조회
72 경로를 읽어서 해당경로가 존재하지 않으면 폴더 생성하기[6] 루카스 2011.12.09 4617
71 [비베 6][TIP] 주석을 여러줄을 써보자[7] qwqw1312 2011.09.01 6752
70 [비베 6]if문을 이용하여 자신만의 아이디, 비밀번호 지정사진[5] qwqw1312 2011.09.01 5654
69 [비베 2010]폼 투명도 바꾸는 트랙바!!첨부파일[12] kchdully 2010.02.13 6332
68 [비베 2008][TIP] ListView Item 추가 퍼포먼스 향상.첨부파일[7] Juma 2009.09.27 7467
67 [비베 2008][TIP] Process 클래스를 이용한 간단한 연결 프로그램 실행.[2] Juma 2009.09.27 6120
>> [비베 2008]IMessage Filter를 상속하여 어플리케이션 단위의 메시지 후킹.첨부파일[3] Juma 2009.09.27 6658
65 [비베 2008]경로 탐색.사진첨부파일[3] Juma 2009.09.27 5635
64 [비베 6][크리스의 비베 강좌] -01- 변수 선언[12] 크리스Kof 2007.12.10 6348
63 [비베 6]비주얼 베이직 기초동영상강좌1부터~20첨부파일[23] Нyan™ 2007.12.03 12924
62 [비베 6]비주얼 베이직 6 SP6 개발용사진첨부파일[26] COOLSOFT 2007.11.24 7505
61 [비베 6]비주얼 베이직 설치하기사진첨부파일[10] COOLSOFT 2007.10.27 9406
60 [비베 6]텍스트 상자 엔터키로 다음텍스트로 이동하기[2] 진진 2008.03.26 6018
59 [비베 6]반투명 처리 퍼옴[4] 진진 2008.03.26 6069
58 [비베 6]프로그램을 감지하여 강제 종료[7] COOLSOFT 2008.02.27 6343
57 [비베 6]VB실습강의(기초부터-김석수)첨부파일[26] 외눈박이™ 2008.01.24 8670
56 [비베 6][크리스의 비베 강좌] -03- 조건문(IF)[3] 크리스Kof 2008.01.12 5630
55 [비베 6]파일의 유무를 확인해보자 ! PathFileExists API ![4] yrisiku 2008.01.05 6080
54 [비베 6]변수의 데이터형에 대해 알아봅시다 :)사진첨부파일[2] yrisiku 2008.01.05 6851
53 [비베 6]Tip) 사용자 정의 프로시저/함수를 만들떄, 선택적 인수를 만들어보자 ![3] yrisiku 2008.01.05 7755
처음페이지이전 10 페이지1234다음 10 페이지마지막페이지