[英]How to draw graphics/text on top of another application
我想增強一個應用程序,但沒有3:e party API可用。 所以基本上這個想法是在應用程序窗口之上繪制圖形/文本。
z order,clip和將鼠標點擊指向我的應用程序或其他應用程序時出現問題。
這樣做的優雅方式是什么?
這里的示例圖像。 這是一個交易應用程序,我的應用程序想要在交易應用程序的窗口中添加額外的信息。 [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#代碼將會調用很多並且相應地非常難看。 你的DLL也必須是不受管理的(如果你打算注入你自己以外的進程),這使得這個解決方案更加糟糕。
這將解決您的z-order和裁剪問題,因為您正在渲染到窗口本身。 但是,如果您要定位的應用程序在響應WM_PAINT的WinProc之外進行任何繪制,則事情就會崩潰; 這並非完全不常見。
z order,clip和將鼠標點擊指向我的應用程序或其他應用程序時出現問題。
這些是窗口管理器旨在處理的所有任務。 您應該在應用程序窗口的頂部創建一個分層窗口。
另請參閱: 防止在C ++中重新繪制窗口
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.