Скорее всего, проблема лежит за пределами кода, который вы опубликовали. Ваш InvalidateRect / UpdateWindow закрасит окно один раз после того, как дочерний процесс будет порожден, но он не будет обрабатывать перерисовку при перемещении его позже.
Чтобы решить проблему «Теперь, когда я перемещаю Cmd.exe, а не в фоновом режиме рисования», нужно подумать о том, что вы делаете, пока ожидаете процесс. В ожидании процесса вам все еще нужно обработать входящие сообщения (по крайней мере, WM_PAINT
один).
Вы не можете использовать WaitForSingleObject для ожидания процесса, вам нужно использовать некоторую функцию, которая также позволит вам обрабатывать сообщения, например, MsgWaitForMultipleObjects - это ваше приложение, которому нужно перерисовывать окно каждый раз при отправке WM_PAINT, никто не будет делать это для тебя.
Другой подход заключается в том, чтобы вообще не ждать процесса, а реализовать обработку его результата управляемым событиями способом, прямо в главном цикле сообщений (то, что вы делаете сейчас, можно рассматривать как «модальный» процесс, возможно, вы может переосмыслить ваше приложение, чтобы оно стало "немодальным").