C++ 将另一个程序的背景色从C++;程序
我正在尝试更改我没有编写的程序的背景色 用Spy++查看它,我可以看到主类是“ThunderRT6FormDC”。它的一个孩子上了“ThunderRT6Frame”课。在ThunderRT6Frame内部有一组ThunderRT6CommandButtons 我想更改按钮后面的背景色。我试图通过改变ThunderRT6Frame窗口的颜色来实现这一点,但我无法让它工作。有什么想法吗 这是我第一次尝试的:C++ 将另一个程序的背景色从C++;程序,c++,winapi,gdi,C++,Winapi,Gdi,我正在尝试更改我没有编写的程序的背景色 用Spy++查看它,我可以看到主类是“ThunderRT6FormDC”。它的一个孩子上了“ThunderRT6Frame”课。在ThunderRT6Frame内部有一组ThunderRT6CommandButtons 我想更改按钮后面的背景色。我试图通过改变ThunderRT6Frame窗口的颜色来实现这一点,但我无法让它工作。有什么想法吗 这是我第一次尝试的: HWND hwndCnt = FindWindow("ThunderRT6FormDC",
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);
没有明显的变化,所以我继续注入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:
将MessageBox放在不同的WM_*案例中,我可以看到正在绘制的矩形,即使在我关闭所有消息框后,矩形仍保留在屏幕上。但是如果我没有任何消息框,我就看不到矩形
所以我猜在我画完窗户后,有什么东西在重新画窗户。重画的目的是什么,在哪里
编辑3:
清理我的代码,只为ThunderRT6Form窗口保留WM_油漆,使其工作正常。这就是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_绘制一样处理WM_橡皮擦GND消息,你可能会看到一些成功。不走运。“在我看来,什么也没有画得远。@Tobbe,你想做的事情是困难的,应该是这样的。您是否尝试输入一些指示符来查看您的代码是否被调用?我现在有:)并且代码正在被调用。更多细节,请参见我对问题的第二次编辑。我接受这个答案,因为你关于指示器的提示将我引向正确的方向:)@Tobbe,现在我很好奇-你找到消失矩形的原因了吗?你的最终解决方案看起来很简单。嗨,你从哪里得到wm_绘画信息?请显示完整的代码。。。每个人都说wm_paint,wm_ERASEBKGND你是怎么得到/抓住wm_uuxxxxx的???哇!这是8年前的代码。我再也不知道这些了:D:(对不起!