2014年1月12日日曜日

UOの画面上に直接ボタン(ウィンドウ)を貼り付けられないものか?

調査してみた。

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 件のコメント:

コメントを投稿