|
'서브클래싱'에 해당되는 글 1건
[폭주기관차, 2007/02/06 11:18, [Programming]/Visual C++ API/MFC]
서브클래싱이란 쉽게 말해 윈도우 메세지를 가로채오는 것을 말한다.
EDIT BOX → WM_KEYDOWN 이런식으로 돌아가는데 내가 WM_KEYDOWN 메세지가 발생했을 때 다른 기능을 수행하고 싶다하면 EIDT BOX WM_KEYDOWN ↘ ↑ 내가 만든 WM_KEYDOWN 수행 이렇게 패턴을 바꾸게 할 수가 있는 것이다. 서브 클래싱을 위해서는 우선 다음과 같은 변수들이 필요하다 HWND hSub; // 서브클래싱할 윈도우 핸들그리고 서브 클래싱을 위한 Proc Callback함수도 필요하다. LRESULT CALLBACK Test1Proc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);이 콜백 함수는 기본적으로 아래와 같이 구성되어있다. LRESULT CALLBACK Test1Proc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)CallWindowProc는 내가 WM_KEYDOWN수행을 한 후 다시 원래 처리를 해야하는 코드를 위해 호출 한다. 만약 이 함수를 호출 하지 않으면 내가 구현한 코드만 수행 후 그냥 끝나게 된다. 구조를 보면 아래와 같다. EIDT BOX WM_KEYDOWN ↘ 내가 만든 WM_KEYDOWN → return 0; EIDT BOX WM_KEYDOWN ↘ ↑ 내가 만든 WM_KEYDOWN → CallWindowProc(...) 참, 중요한 설정하는 부분을 빼먹을 뻔 했다. 서브클래싱을 설정하는 함수는 SetWindowLong이란 함수를 사용한다. 아래와 같이 하면 된다. wp_OldSubProc = (WNDPROC)SetWindowLong( hSub, GWL_WNDPROC, (LONG)Test1Proc );hSub => 서브클래싱 대상 윈도우 핸들 GWL_WNDPROC => hSub 윈도우의 프로시져 주소를 다음 매개변수로 바꾸겠다. Test1Proc => 교체할 프로시져 주소 wp_OldSubProc => 프로시져 주소가 교체되기 전 원래의 프로시져 주소 그리고 이렇게 설정해준 후 종료할때는 다시 원래의 프로시져 주소를 넣어주어야 한다. 대개 WM_DESTROY 이 메세지에 넣어 준다. // 프로그램 종료시 다시 원래의 프로시져 주소로 교체 해준다.이 서브클래싱을 이용하면 다른 Process의 윈도우를 서브클래싱은 할 수가 없고 (여러 방면으로 테스트해봤지만 안되더라...) 자기 Process내의 Child Window Class에 한해서만 서브클래싱을 할 수가 있다. 다른 Process의 Child Window Class를 서브클래싱 하려면 아무래도 훅을 사용해야할 듯 싶다. 전역 클래싱 : 서브 클래싱은 특정 윈도우 클래스를 상대로 하지만, Trackback Address :: http://kongmks.cafe24.com/trackback/87
|
||





