Feedback

C# - FileDialog modal zu Kommandozeile anzeigen

Veröffentlicht von am 8/12/2008
(1 Bewertungen)
Wenn man in einer ConsoleApplication OpenFileDialog.ShowDialog() aufruft, ist dieser mitnichten modal zur Console. Man benötigt das WindowHandle der Console, um es dazu zu bringen.
using System;
using System.Diagnostics;
using System.Windows.Forms;

public class Program
{
    private static CommandLineWindow s_Window = new CommandLineWindow();

    [STAThread()]
    public static void Main(String[] args)
    {
        using(OpenFileDialog ofd = new OpenFileDialog())
        {
            //funktioniert nicht:
            //ofd.ShowDialog();

            //funktioniert:
            ofd.ShowDialog(s_Window);
        }
    }
}

internal class CommandLineWindow : IWin32Window
{
    #region IWin32Window Members
    public IntPtr Handle
    {
        get
        {
            return (Process.GetCurrentProcess().MainWindowHandle);
        }
    }
    #endregion
}
Abgelegt unter Komanndozeile, FileDialog, modal.

3 Kommentare zum Snippet

Koopakiller schrieb am 9/7/2014:
Unter welchen Umständen ist denn der Aufruf denn nicht modal? Unter .NET 2.0 und 4.5.1 erscheint die Ausgabe "Test" erst nach dem Schließen des Dialoges:
[STAThread()]
static void Main(string[] args)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.ShowDialog();
Console.WriteLine("Test");
Console.ReadKey();
}


Auch frage ich mich was CommandLineWindow ist. Ich kann diese Klasse nirgens in der MSDN finden.
DJ Doena schrieb am 9/7/2014:
Das Program hält schon an, aber der Window-Owner ist nicht zwingend die Kommandozeilen-Applikation.

Bei einem Windows-Forms-Program wird ein Modal-Window immer das Qull-Fenster der Parent sein.

Eine Kommandozeile verhält sich da anders. Da kann es schon mal passieren, dass dein Outlook oder dein Firefox plötzlich der Modal-Parent ist und das bedeutet, dass du Outlook/Firefox nicht mehr bedienen kannst, bis du das Modal-Fenster schließt.

Dein Program-Code hält natürlich trotzdem an, bis das Fenster geschlossen wurde.

Und die Klasse CommandLineWindow ist oben implementiert, du musst das Snippet schon richtig lesen.
Koopakiller schrieb am 9/11/2014:
Die Klasse CommandLineWindow habe ich übersehen, da der Sichtbare Bereich des Snippets wie der ganze Quellcode aussah - nächstes mal lese ich genauer.

Wenn der Dialog ohne angabe eines Parents aufgerufen wird, wird IMHO 0 verwendet - das Fenster wird also wie ein normales Fenster angezeigt. Da sollte es keine Probleme mit anderen Programmen geben - ich lasse mich gern widerlegen, aber bitte mit einem Beispielszenario.
Wenn die Konsole als Anwendung gestartet wird, ist der OFD in deinem Beispiel modal zum Konsolenfenster. Das funktioniert jedoch nicht, wenn man die Konsole aus der CMD heraus aufruft. Dort ist das MainWindowHandle immer 0. GetConsoleWindow aus der kernel32.dll müsste aber das richtige Handle zurück liefern.
 

Logge dich ein, um hier zu kommentieren!