【问题标题】:Change background color of another program from C++ program从 C++ 程序更改另一个程序的背景颜色
【发布时间】:2010-08-17 22:01:09
【问题描述】:

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

用 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 子类,但没有绘制我可以看到的红色矩形。

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

PS。我正在尝试更改的程序中的窗口类名称表明它是一个 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:

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

所以我猜想在我画完窗户后会重新绘制窗户。重绘的目的是什么,在哪里进行?

编辑 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_paint ,WM_ERASEBKGND 你如​​何获得/捕捉那个 wm_XXXXX ???
  • 哇!这是八年前的代码。我对此一无所知 :D :( 抱歉!

标签: c++ winapi gdi


【解决方案1】:

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

【讨论】:

  • 不走运。就我所见,什么都没有画出来。
  • @Tobbe,你想做的事情很困难,因为它应该是。您是否尝试过放置一些指标来查看您的代码是否被调用?
  • 我现在有 :) 并且代码 正在 被调用。有关详细信息,请参阅我对该问题的第二次编辑。
  • 我接受这个作为答案,因为您对指标的提示将我引向正确的方向:)
  • @Tobbe,现在我很好奇 - 你有没有找到矩形消失的原因?您的最终解决方案看起来既漂亮又简单。
猜你喜欢
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 2010-11-12
  • 1970-01-01
相关资源
最近更新 更多