2010-08-17 3 views
2

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

Посмотрите на него со 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; 

Я 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; 
} 

Но я не получаю видимых результатов

EDIT 2:

реализация концепции MessageBoxes в в разных случаях WM_ * я вижу, что прямоугольники являются pa inted, и даже после того, как я закрыл все окна сообщений, прямоугольники остаются на экране. Но если у меня нет ящиков сообщений, я не вижу прямоугольников.

Так что я предполагаю, что что-то перерисовывает окна после того, как я на них нарисовал. Что делает это перерисовка, и где?

EDIT 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; 
} 

EDIT 4:

Я никогда не узнал, почему именно прямоугольники не будут отображаться в моих первых попытках. Но в моем коде какая-то ошибка.

Это то, что я сделал: сначала я добавил окна сообщений, чтобы убедиться, что все коды вызываются. Это привело к появлению прямоугольников. Затем я немного пошарил, где у меня были окна сообщений (только для формы, только для фрейма, только для WM_PAINT и т. Д.). И я всегда получал прямоугольник. Затем я удалил все окна сообщений и, конечно же, прямоугольники тоже ушли. Поэтому я добавил несколько ящиков сообщений и начал очищать свой код.Некоторые из этих «чистых» исправили мою ошибку, потому что после этого я мог удалить все окна сообщений и по-прежнему рисовать на фоне.

ответ

1

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

+0

Не повезло. Насколько мне известно, ничего не видно. – Tobbe

+0

@Tobbe, То, что вы пытаетесь сделать, сложно, как и должно быть. Вы пытались ввести какой-либо индикатор, чтобы узнать, вообще ли ваш код вообще вызван? –

+0

У меня сейчас :) И код * есть *. Дополнительную информацию см. В моей второй редакции. – Tobbe

Смежные вопросы