調査してみた。
Spy++を使うと、クライアントのウィンドウハンドルは唯一。
つまり、子ウィンドウを貼り付けているわけではなく、1枚のウィンドウにすべて描画している。
ここで、BitBltにブレークポイントを仕掛けてラスタオペレーションコードを書き換えたりすると、どうやらBitBltのみ使用して全ての画像データを書き込んでいることがわかった。
多分こんなコードと推測。
hdc=GetDC(hwnd);
BitBlt(hdc, ...);
ReleaseDC(hwnd, hdc);
なので、クライアントのウィンドウに子ウィンドウをはりつける、もしくは描画する場合の案として以下が考えられる。
(1) BitBltの前にクリップ情報を追加する
(2) BitBltの後に描画処理を追加する
とここで困ってしまうのは、(1)または(2)をどうやって実現するか。
デバッガでブレークポイントを仕掛けると、BitBltの前後に処理を追加できる。
しかし、DCをプロセス間で共有できないっぽいので、デバッガにDCを操作する関数を追加して実行させても無意味><
となるとインジェクションしたDLLにて、IATのBitBltアドレスを書き換える、もしくはBitBltを呼んでる位置を書き換えて、DLL内に用意したコードを経由させる方法しかないのだろうか。。。
DLLにはもう新たにコードを追加したくないしなぁ。。。
うーむ、デバッガ使用でチラつかせず実装できないものか。
追記:)
重い腰を上げ、DLL内にExcludeClipRect()を追加したら、DCのクリップ領域がうまく設定された^^
クリップ領域って毎回更新する必要があるのかと思ってたよ^^;;;
なんとかなりそ???
0 件のコメント:
コメントを投稿