2013-09-25 1 views
1

SetWindowSubclass()를 사용하여 창을 서브 클래 싱하고 내 메시지 처리기를 성공적으로 호출했지만 DefWindowProc()을 호출하여 원래 처리를 위해 메시지를 전달할 때 메시지가 전달되지 않습니다!DefWindowProc()에서 아무것도 전달하지 않는 이유는 무엇입니까?

우리는 Marmalade (크로스 플랫폼 모바일 개발 용 키트)의 확장 프로그램을 작성 중입니다. 특정 플랫폼 용 네이티브 확장을 허용하며 Windows 데스크톱 빌드 용으로 작성합니다. 우리는 메시지 루프에 직접 액세스 할 수는 없지만 메시지를 직접 처리하기 위해 서브 클래 싱 할 수는 있지만 정상적인 처리를 위해 메시지를 다시 마멀레이드에 전달할 수있는 것 같지 않습니다.

예를 들어, 심지어 콜백에서 아무것도하지 않고 있지만 DefWindowProc를 지나온()를 호출하면 여전히 작동하지 않습니다

// Initialization: 
const UINT_PTR gSubClassId = NULL; 
DWORD_PTR subClassCBData = NULL; 
SetWindowSubclass(gMainWindow, CadUtil_WindowCB, gSubClassId, subClassCBData); 
... 
// Message processing callback. 
static LRESULT CALLBACK CadUtil_WindowCB(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) 
{ 
    // Messages are correctly diverted here, but DefWindowProc() below isn't passing them on. 
    return DefWindowProc(hWnd, message, wParam, lParam); 
} 

이런 일이 할 수있는 방법 어떤 생각을?

감사합니다.
Rob.

답변

0

서브 클래 싱이 작동하지 않는 이유는 아직도 모르지만 대신 후크를 사용하여 해결할 수있었습니다. 따라서 SetWindowSubclass()를 사용하여 메시지를 캡처하고 DefWindowProc()을 전달하는 대신 SetWindowsHookEx()를 WH_CALLWNDPROC 및 WH_GETMESSAGE와 함께 사용하여 메시지를 캡처하고 CallNextHookEx()를 호출하여 메시지를 전달합니다. 이것은 서브 클래스 화가하지 않는 곳에서 작동합니다.

0

코드 예제의 문제점은 창을 서브 클래 싱 할 때 DefWindowProc 대신 DefSubclassProc를 호출해야한다는 것입니다.

관련 문제