J'essaie de changer la couleur d'arrière-plan d'un programme que je n'ai pas écrit. En regardant avec Spy ++, je peux voir que la classe principale est "ThunderRT6FormDC". Un de ses enfants a la classe "ThunderRT6Frame". À l'intérieur de ThunderRT6Frame, il y a un tas de ThunderRT6CommandButtons.Modifier la couleur d'arrière-plan d'un autre programme du programme C++
Je veux changer la couleur d'arrière-plan derrière les boutons. J'ai essayé de le faire en changeant la couleur de la fenêtre ThunderRT6Frame, mais je ne peux pas le faire fonctionner. Des idées?
C'est ce que j'ai essayé d'abord:
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);
Aucun changement visible est sorti de ça, alors je me suis déplacé à l'injection d'une dll et sous-classe 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;
Je WM_PAINT sous-classé pour à la fois ThunderRT6FormDC et ThunderRT6Frame mais aucun rectangle rouge n'est dessiné que je peux voir.
Qu'est-ce que je fais mal? Quoi d'autre dois-je essayer?
PS. Les noms de classe de fenêtre dans le programme que j'essaie de changer indiquent qu'il s'agit d'un programme VB6, si cela peut vous aider.
EDIT:
J'ai essayé d'ajouter ce qui suit à deux procédures de fenêtre
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;
}
Mais je reçois aucun résultat visible
EDIT 2:
MessageBoxes mise en les différents cas WM_ * je peux voir les rectangles étant pa inted et même après que j'ai fermé toutes les boîtes de message les rectangles sont laissés sur l'écran. Mais si je n'ai pas de boîte de message, je ne vois pas les rectangles.
Donc je suppose que quelque chose est en train de redessiner les fenêtres après que je les ai peintes. Que fait ce redessin, et où?
EDIT 3:
Nettoyage mon code et en gardant juste WM_PAINT pour la fenêtre ThunderRT6Form fait fonctionner. C'est ce que WM_PAINT ressemble maintenant:
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:
Je ne ai jamais su exactement pourquoi les rectangles ne se présentent pas dans mes premiers essais. Mais c'était une erreur dans mon code quelque part.
Voici ce que j'ai fait: J'ai d'abord ajouté des boîtes de message pour m'assurer que tout le code était appelé. Cela a fait apparaître les rectangles. Puis j'ai tripoté un peu avec où j'avais les boîtes de message (seulement pour le formulaire, seulement pour le cadre, seulement pour WM_PAINT etc). Et j'ai toujours le rectangle. Puis j'ai enlevé toutes les boîtes de message, et bien sûr, les rectangles sont partis aussi. J'ai donc ajouté des boîtes de message et j'ai commencé à nettoyer mon code.Une partie de ce "nettoyage" a corrigé mon erreur, car après cela j'ai pu enlever toutes les boîtes de message et être toujours capable de peindre sur le fond.
Pas de chance. Rien n'est dessiné autant que je peux voir. – Tobbe
@Tobbe, Ce que vous essayez de faire est difficile, comme il se doit. Avez-vous essayé de mettre un indicateur pour voir si votre code est même appelé? –
J'ai maintenant :) Et le code * est * appelé. Voir mon deuxième edit à la question pour plus de détails. – Tobbe