がこれを行うには素敵な方法がありませんが、あなたのために働くことができる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以外の図面を作成した場合、それらは分断されます。これはまれな出来事ではありません。
のためのdirectXの上にそれを描きたいのでしょうか?別のアプリケーションのウィンドウにテキストを置いてそこにとどまるような醜い方法しかない、エレガントな方法はありません。 しかし、あなたの状況に応じて、他の方法で何をしたいかを達成できるかもしれません。 –
私がしたいことを実証するためにイメージが追加されました – s5804