2009-06-03 11 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

子供以外のウィンドウにオーバーレイをペイントするのはどうですか? –