簡體   English   中英

如何在另一個應用程序之上繪制圖形/文本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM