必要条件は、別のアプリケーションのウィンドウの横に自分の情報を描画することです。 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;
}
コンテキストメニューはどこでも、私の関心領域が含まれている可能性があるため、描画更新領域をテストするために十分ではありません。
GetClassNameは便利でした。他の提案はwelcomです。 – s5804
子供以外のウィンドウにオーバーレイをペイントするのはどうですか? –