Вы можете обрабатывать это только одной логикой, хотя я должен признать, что приведенные выше рекомендации, в которых вы используете метод BringToFront без фактического кражи фокуса, являются самыми элегантными.
Во всяком случае, я столкнулся с этим и решил, используя свойство DateTime, чтобы запретить дальнейшие вызовы BringToFront, если вызовы были сделаны уже недавно.
Предположим, что базовый класс 'Core' обрабатывает, например, три формы: Form1, 2 и 3. Каждой форме требуется свойство DateTime и событие Activate, которое вызывает Core, чтобы вывести окна на передний план:
internal static DateTime LastBringToFrontTime { get; set; }
private void Form1_Activated(object sender, EventArgs e)
{
var eventTime = DateTime.Now;
if ((eventTime - LastBringToFrontTime).TotalMilliseconds > 500)
Core.BringAllToFront(this);
LastBringToFrontTime = eventTime;
}
А затем создайте работу в Базовом классе:
internal static void BringAllToFront(Form inForm)
{
Form1.BringToFront();
Form2.BringToFront();
Form3.BringToFront();
inForm.Focus();
}
Если вы хотите восстановить свернутое окно в исходное состояние (не развернуто), отметьте:
inForm.WindowState = FormWindowState.Normal;
Опять же, я знаю, что это всего лишь патч для решения проблемы отсутствия BringToFrontWithoutFocus. Подразумевается, если вы хотите избежать DLL-файла.