【问题标题】:How to draw graphics/text on top of another application如何在另一个应用程序之上绘制图形/文本
【发布时间】:2009-05-02 21:26:56
【问题描述】:

我想增强应用程序,但没有可用的 3:e 派对 API。 所以基本上这个想法是在应用程序窗口的顶部绘制图形/文本。

z 顺序、剪切和将鼠标点击指向我的应用程序或其他应用程序存在问题。

这样做的优雅方法是什么?

此处为示例图片。这是一个交易应用程序,我的应用程序想要在交易应用程序的窗口中添加额外的信息。 [网址=http://img104.imageshack.us/my.php?image=windowontop.png][/URL]

【问题讨论】:

  • 您能更具体地说明您想要做什么吗?没有优雅的方法可以将文本放在另一个应用程序的窗口上并让它保持在那里,只有丑陋的方法。但你也许可以通过其他方式实现你想要的,这取决于你的具体情况。
  • 添加图片来展示我想要做什么

标签: c# windows winapi graphics


【解决方案1】:

没有很好的方法可以做到这一点,但一种可能对您有用的方法是使用 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 的绘图,事情就会崩溃;这种情况并不少见。

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      z顺序有问题, 剪辑和引导鼠标点击 无论是我的申请还是其他 应用。

      这些都是窗口管理器旨在处理的任务。您应该在应用程序窗口的顶部创建一个分层窗口。

      另请参阅:Prevent repainting of window in C++

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多