2009-05-02 15 views
6

私はアプリケーションを拡張したいが、3:eパーティAPIはありません。 基本的には、アプリケーションウィンドウの上にグラフィックス/テキストを描くことです。他のアプリケーションの上にグラフィックス/テキストを描画する方法

zオーダー、クリッピング、およびマウスクリックがアプリケーションまたは他のアプリケーションのいずれかに問題があります。

これを行ううまい方法は何ですか?

ここに例を示します。これは、私のアプリケーションがトレーディングアプリケーションのウィンドウに余分な情報を追加したいトレーディングアプリケーションです。 [URL = http://img104.imageshack.us/my.php?image=windowontop.png][/URL]

+0

のためのdirectXの上にそれを描きたいのでしょうか?別のアプリケーションのウィンドウにテキストを置いてそこにとどまるような醜い方法しかない、エレガントな方法はありません。 しかし、あなたの状況に応じて、他の方法で何をしたいかを達成できるかもしれません。 –

+0

私がしたいことを実証するためにイメージが追加されました – s5804

答えて

7

がこれを行うには素敵な方法がありませんが、あなたのために働くことができる1つのアプローチはであなたのオーバーレイを描画GetMsgProcを追加するためには、SetWindowsHookEx(...)を使用して、問題のアプリケーションを、フックすることですWM_PAINTメッセージへの応答。基本的なアイデアは、アプリケーションが独自の描画を終えた直後にあなたのグラフィックを描画することです。どこかのDLLでオフ

.... 
HMODULE hDllInstance = LoadLibrary("myFavoriteDll"); 
HOOKPROC pOverlayHook = (HOOKPROC)GetProcAddress(hDllInstance, "OverlayHook"); 
SetWindowsHookEx(WH_GETMESSAGE, pOverlayHook, hDllInstance, threadId); 

:あなたのメインアプリで

LRESULT CALLBACK OverlayHook(int code, WPARAM wParam, LPARAM lParam) 
{ 
    //Try and be the LAST responder to WM_PAINT messages; 
    //Of course, if some other application tries this all bets are off 
    LRESULT retCode = CallNextHookEx(NULL, 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; 

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

    PAINTSTRUCT psPaint;  

    BeginPaint(message->hwnd, &psPaint); 
    //Draw your overlay here 
    ... 
    EndPaint(message->hwnd, &psPaint); 

    return retCode; 
} 

あなたのC#コードは、p /重いとそれに対応し、非常に醜い呼び出しになりますので、これは、すべてのWin32です。あなたのDLLも管理されていなくてはなりません(自分以外のプロセスに注入する場合)。

これは、ウィンドウ自体にレンダリングする際に、zオーダーとクリッピングの問題を解決します。しかし、対象とするアプリケーションがWMPAINTに応答するWinProc以外の図面を作成した場合、それらは分断されます。これはまれな出来事ではありません。

0

zのために問題、 クリッピング、および自分のアプリケーションまたは他の アプリケーションにどちらかのマウスクリックに を向けることがあります。

これらはすべて、ウィンドウマネージャが処理するように設計されたタスクです。アプリのウィンドウの上にレイヤードウィンドウを作成する必要があります。

も参照してください:Prevent repainting of window in C++

関連する問題