gpt4 book ai didi

c++ - 从 C++ 程序更改另一个程序的背景颜色

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:25 25 4
gpt4 key购买 nike

我正在尝试更改不是我编写的程序的背景颜色。

用 Spy++ 查看它,我可以看到主类是“ThunderRT6FormDC”。它的一个 child 拥有“ThunderRT6Frame”类。在 ThunderRT6Frame 内部有一堆 ThunderRT6CommandButtons。

我想更改按钮后面的背景颜色。我尝试通过更改 ThunderRT6Frame 窗口的颜色来执行此操作,但我无法让它工作。有什么想法吗?

这是我首先尝试的:

HWND hwndCnt = FindWindow("ThunderRT6FormDC", NULL);
HWND hwndCntFrame = FindWindowEx(hwndCnt, NULL, "ThunderRT6Frame", NULL);

SetClassLong(hwndCnt, GCL_HBRBACKGROUND, (LONG)CreateSolidBrush(RGB(220,220,255)));
InvalidateRect(hwndCnt, 0, TRUE);
SetClassLong(hwndCntFrame, GCL_HBRBACKGROUND, (LONG)CreateSolidBrush(RGB(220,220,255)));
InvalidateRect(hwndCntFrame, 0, TRUE);

没有明显的变化,所以我继续注入(inject)一个 dll 和子类 WM_PAINT:

PAINTSTRUCT ps;
HDC hdcPaint = BeginPaint(Hwnd, &ps);
SetBkColor(hdcPaint, RGB(255,0,0));

HPEN pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
HBRUSH brush = CreateSolidBrush(RGB(255, 0, 0));

HPEN hOldPen = (HPEN)SelectObject(hdcPaint, pen);
HBRUSH hOldBrush = (HBRUSH)SelectObject(hdcPaint, brush);

RoundRect(hdcPaint, 1, 1, 100, 100, 10, 10);

SelectObject(hdcPaint, hOldPen);
SelectObject(hdcPaint, hOldBrush);

DeleteObject(pen);
DeleteObject(brush);

EndPaint(Hwnd, &ps);

return 0;

我为 ThunderRT6FormDC 和 ThunderRT6Frame 都创建了 WM_PAINT 的子类,但是没有绘制我能看到的红色矩形。

我做错了什么?我还需要尝试什么?

附言。我试图更改的程序中的窗口类名称表明它是一个 VB6 程序,如果有帮助的话。

编辑:

我尝试将以下内容添加到两个窗口过程

case WM_ERASEBKGND:
{
HDC hdcPaint = (HDC)wParam;
SetBkColor(hdcPaint, RGB(255,0,0));

HPEN pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
HBRUSH brush = CreateSolidBrush(RGB(255, 0, 0));

HPEN hOldPen = (HPEN)SelectObject(hdcPaint, pen);
HBRUSH hOldBrush = (HBRUSH)SelectObject(hdcPaint, brush);

RoundRect(hdcPaint, 1, 1, 100, 100, 10, 10);

SelectObject(hdcPaint, hOldPen);
SelectObject(hdcPaint, hOldBrush);

DeleteObject(pen);
DeleteObject(brush);

return TRUE;
}

但是我没有得到可见的结果

编辑 2:

在不同的 WM_* 案例中放置消息框 我可以看到正在绘制的矩形,甚至在我关闭所有消息框之后,矩形仍留在屏幕上。但如果我根本没有任何消息框,我就看不到矩形。

所以我猜我在 window 上绘画后,有什么东西正在重新绘制它们。重绘的目的是什么,在哪里?

编辑 3:

清理我的代码并为 ThunderRT6Form 窗口保留 WM_PAINT 使其工作。这就是 WM_PAINT 现在的样子:

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdcPaint = BeginPaint(Hwnd, &ps);
HBRUSH brush = CreateSolidBrush(RGB(255, 255, 255));

RECT r;
GetClientRect(Hwnd, &r);
FillRect(hdcPaint, &r, brush);

DeleteObject(brush);
EndPaint(Hwnd, &ps);

return 0;
}

编辑 4:

我从来没有弄清楚为什么这些矩形在我的第一次尝试中没有出现。但这是我的代码某处的一些错误。

这就是我所做的:首先我添加了消息框以确保所有代码都被调用。这使得矩形出现了。然后我摆弄了一下我有消息框的地方(仅适用于表单,仅适用于框架,仅适用于 WM_PAINT 等)。我总是得到矩形。然后我删除了所有的消息框,果然,矩形也消失了。所以我重新添加了一些消息框并开始清理我的代码。其中一些“清理”修复了我的错误,因为之后我可以删除所有消息框并仍然能够在背景上绘画。

最佳答案

如果您以类似于处理 WM_PAINT 的方式处理 WM_ERASEBKGND 消息,您可能会看到一些成功。

关于c++ - 从 C++ 程序更改另一个程序的背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3507322/

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