Изменить цвет фона другой программы из программы на C ++ - PullRequest
2 голосов
/ 18 августа 2010

Я пытаюсь изменить цвет фона программы, которую я НЕ написал.

Глядя на это с помощью Spy ++, я вижу, что основным классом является "ThunderRT6FormDC". У одного из его детей есть класс "ThunderRT6Frame". Внутри ThunderRT6Frame есть несколько кнопок ThunderRT6Command.

Я хочу изменить цвет фона за кнопками. Я попытался сделать это, изменив цвет окна 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;

У меня есть подклассы WM_PAINT для ThunderRT6FormDC и ThunderRT6Frame, но красный прямоугольник не отображается, чтобы я мог видеть.

Что я делаю не так? Что еще мне нужно попробовать?

PS. Имена классов окон в программе, которую я пытаюсь изменить, указывают, что это программа VB6, если это поможет.

EDIT:

Я попытался добавить следующее в обе оконные процедуры

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:

Очистив мой код и сохранив только WM_PAINT для окна ThunderRT6Form, он заработал. Вот как выглядит 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 и т. Д.). И я всегда получал прямоугольник. Затем я удалил все окна сообщений и, конечно же, прямоугольники тоже исчезли. Поэтому я добавил несколько окон сообщений и начал очищать свой код. Часть этой «очистки» исправила мою ошибку, потому что после этого я мог удалить все окна сообщений и все еще иметь возможность рисовать на фоне.

1 Ответ

1 голос
/ 18 августа 2010

Вы можете увидеть некоторый успех, если обработаете сообщение WM_ERASEBKGND аналогично тому, как вы обрабатываете WM_PAINT.

...