2009-06-03 3 views
1

요구 사항은 다른 응용 프로그램의 창 옆에 내 정보를 그립니다. WH_GETMESSAGE와 WM_PAINT를 연결하여 z 순서 등을 처리하는 것이 좋습니다.후크 할 때 오버레이 창이 올바르게 그려지지 않음

그러나 일부 WM_PAINT는 내 관심 영역의 창을 대상으로하지만 다른 WM_PAINT는 상황에 맞는 메뉴 나 버튼처럼 완전히 다른 무언가를위한 것입니다.

예제 메모장은 메모장 화면에 "Hello"라고 쓰는 오버레이로 연결됩니다. 이것은 잘 작동합니다. 그러나 메모장을 마우스 오른쪽 버튼으로 클릭하면 상황에 맞는 메뉴가 Hello로 오버레이됩니다. 기본적으로 상황에 맞는 메뉴가 삭제됩니다.

WM_PAINT가 컨텍스트 메뉴인지 확인하는 훌륭한 방법이 있습니까?

LRESULT CALLBACK overlayHook(int code, WPARAM wParam, LPARAM lParam) { 
    //Try and be the LAST responder to WM_PAINT messages; 
    LRESULT retCode = CallNextHookEx(hhk, code, wParam, lParam); 

    //Per GetMsgProc documentation, don't do anything fancy 
    if(code < 0) { 
     return retCode; 
    } 

    //Assumes that target application only draws when WM_PAINT message is 
    //removed from input queue. 
    if(wParam == PM_NOREMOVE) { 
     return retCode; 
    } 

    MSG* message = (MSG*)lParam; 
    if(message->message != WM_PAINT) { 
     //Ignore everything that isn't a paint request 
     return retCode; 
    } 

    PAINTSTRUCT psPaint;  
    BeginPaint(message->hwnd, &psPaint); 
    HDC hdc = psPaint.hdc; 
    RECT r = psPaint.rcPaint;   
    TextOut(hdc, 10, 10, "Hello", 4); 
    EndPaint(message->hwnd, &psPaint); 
    return retCode; 
} 

상황에 맞는 메뉴가 내 관심 영역을 포함 할 수 있기 때문에 그리기 업데이트 영역을 테스트하는 것만으로는 충분하지 않습니다.

답변

0

우아한 방법은 모르겠지만 GetWindowLong()을 사용하여 창 스타일을 가져 오거나 GetClassName()을 사용하여 클래스 이름을 가져온 다음 필터링 결정의 기준으로 삼을 수 있습니다.

+0

GetClassName이 유용했습니다. 다른 제안은 welcom입니다. – s5804

+0

자녀가 아닌 창에 오버레이를 페인팅하면 어떨까요? –

관련 문제