Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将另一个程序的背景色从C++;程序_C++_Winapi_Gdi - Fatal编程技术网

C++ 将另一个程序的背景色从C++;程序

C++ 将另一个程序的背景色从C++;程序,c++,winapi,gdi,C++,Winapi,Gdi,我正在尝试更改我没有编写的程序的背景色 用Spy++查看它,我可以看到主类是“ThunderRT6FormDC”。它的一个孩子上了“ThunderRT6Frame”课。在ThunderRT6Frame内部有一组ThunderRT6CommandButtons 我想更改按钮后面的背景色。我试图通过改变ThunderRT6Frame窗口的颜色来实现这一点,但我无法让它工作。有什么想法吗 这是我第一次尝试的: HWND hwndCnt = FindWindow("ThunderRT6FormDC",

我正在尝试更改我没有编写的程序的背景色

用Spy++查看它,我可以看到主类是“ThunderRT6FormDC”。它的一个孩子上了“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);
没有明显的变化,所以我继续注入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:(对不起!