Ответ на 4 вопрос:
Когда деревья были маленькими, а Windows только появилась, то была функция SetActiveWindow, которая делала выбранное окно активным — выбрасывало на первый план. Но программисты любили делать свои окна постоянно активными и вызывали эту функцию слишком часто, от этого иногда система уходила в карусель активных окон. Для предотвращения этого в API Windows появилась функция SetForegroundWindow, которая работает почти также, но в случае частых вызовов окна перестают переключаться, а только начинают мигать в панели задач. Это не особенность компьютеров или программ — это внутренняя кухня. Если система решит, что вы слишком часто переключаетесь - она начнёт просто мигать кнопками.
Ответ на 3 вопрос:
Ожидание появление окна — в цикле, по таймеру. Ничего в этом страшного нет. При желании это можно организовать в отдельном потоке.
Помимо этого есть сложные методы внедрения кода в программу, связанные с хуками приложения или перехватом вызовов функций, но не думаю что ваша задача требует такого сложного вмешательства.
Ответ на 2 вопрос:
Видимо у программы так реализован цикл событий, что ваш SendMessage не обработается, пока не придут настоящие события - MOUSE_MOVE, например. Или для диалога нужно текущее активное окно. Или ещё много других подобных причин. Может перед SendMessage должно прийти другое событие.
В большинстве случаев для имитации действий нужно чтобы окно было активным. Если окно не активное, то имитация в равной степени может работать или не работать.
Ответ на 1 вопрос:
Скорее всего меню динамические и создаются по щелчкам мыши и открытию меню. Поэтому вам ничего не остаётся как последовательно имитировать нажатие на меню File, пробег по пунктам меню, и выбор нужного пункта меню — чтобы отработали внутренние механизмы создания подменю.