我想增強應用程序,但沒有3:e party API可用。 所以基本上這個想法是在應用程序窗口上繪製圖形/文本。如何在另一個應用程序頂部繪製圖形/文本
z順序,剪切和將鼠標點擊指向我的應用程序或其他應用程序時存在問題。
這樣做的優雅方式是什麼?
示例圖像在這裏。這是一個交易應用程序,我的應用程序想要在交易應用程序的窗口中添加額外的信息。 [URL = http://img104.imageshack.us/my.php?image=windowontop.png][/URL]
我想增強應用程序,但沒有3:e party API可用。 所以基本上這個想法是在應用程序窗口上繪製圖形/文本。如何在另一個應用程序頂部繪製圖形/文本
z順序,剪切和將鼠標點擊指向我的應用程序或其他應用程序時存在問題。
這樣做的優雅方式是什麼?
示例圖像在這裏。這是一個交易應用程序,我的應用程序想要在交易應用程序的窗口中添加額外的信息。 [URL = http://img104.imageshack.us/my.php?image=windowontop.png][/URL]
有沒有好的方法可以做到這一點,但一個辦法,可以爲你工作是用勾調用SetWindowsHookEx(...)來添加GetMsgProc,吸引你的覆蓋在有問題的應用對WM_PAINT消息的響應。基本的想法是,在應用程序完成自己的繪圖之後,您正在繪製圖形。
在你的主應用程序:
....
HMODULE hDllInstance = LoadLibrary("myFavoriteDll");
HOOKPROC pOverlayHook = (HOOKPROC)GetProcAddress(hDllInstance, "OverlayHook");
SetWindowsHookEx(WH_GETMESSAGE, pOverlayHook, hDllInstance, threadId);
關在某處的DLL:
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;
}
這是所有的Win32所以你的C#代碼會的P/Invoke重和相應相當難看。你的DLL也必須是非託管的(如果你打算注入一個非你自己的進程),這使得這個解決方案更加糟糕。
這將解決您的問題與z順序和裁剪問題,因爲你正在渲染到窗口本身。但是,如果你所定位的應用程序在WinProc之外的任何繪製對WM_PAINT的響應之外,事情就會崩潰;這不是一個非常罕見的事件。
沒有與Z順序, 裁剪的問題,並指導鼠標點擊 無論是我的應用程序或其他應用程序 。
這些都是窗口管理器設計用來處理的所有任務。你應該在應用程序的窗口上創建一個分層窗口。
你能更具體,以你想要做什麼的DirectX的頂部?沒有優雅的方式將文本放在另一個應用程序的窗口上,並讓它留在那裏,只有醜陋的方式。 但是,根據具體情況,您可能可以實現您想要的其他方式。 – 2009-05-03 08:52:33