Du kannst logisch damit umgehen, obwohl ich zugeben muss, dass die obigen Vorschläge, bei denen Sie eine BringToFront-Methode erhalten, ohne den Fokus zu stehlen, die elegantesten sind.
Jedenfalls bin ich darauf gestoßen und habe es mithilfe einer DateTime-Eigenschaft gelöst, um weitere BringToFront-Aufrufe nicht zuzulassen, wenn bereits kürzlich Anrufe getätigt wurden.
Angenommen, eine Kernklasse, 'Core', die beispielsweise drei Formulare, 'Form1, 2 und 3', verarbeitet. Jedes Formular benötigt eine DateTime-Eigenschaft und ein Activate-Ereignis, die Core aufrufen, um Fenster nach vorne zu bringen:
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;
}
Und dann erstellen Sie die Arbeit in der Kernklasse:
internal static void BringAllToFront(Form inForm)
{
Form1.BringToFront();
Form2.BringToFront();
Form3.BringToFront();
inForm.Focus();
}
Nebenbei bemerkt, wenn Sie ein minimiertes Fenster in seinen ursprünglichen Zustand zurückversetzen möchten (nicht maximiert), verwenden Sie:
inForm.WindowState = FormWindowState.Normal;
Auch hier weiß ich, dass dies nur eine Patch-Lösung ist, da kein BringToFrontWithoutFocus vorhanden ist. Es ist als Vorschlag gedacht, wenn Sie die DLL-Datei vermeiden möchten.