gpt4 book ai didi

c# - 如何在另一个应用程序之上绘制图形/文本

转载 作者:可可西里 更新时间:2023-11-01 13:09:18 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

没有好的方法可以做到这一点,但一种可能对您有用的方法是使用 SetWindowsHookEx(...) Hook 有问题的应用程序以添加一个 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 也必须是非托管的(如果您打算注入(inject)您自己的进程以外的进程),这使它成为一个更糟糕的解决方案。

当您渲染到窗口本身时,这将解决您的 z 顺序和裁剪问题。但是,如果您所针对的应用程序在 WinProc 之外进行任何绘图以响应 WM_PAINT,那么事情就会分崩离析;这并非完全不常见。

关于c# - 如何在另一个应用程序之上绘制图形/文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/815667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com