C# Aufgerufene Anwendungen nach dem Start minimieren/verbergen

K

KaffeeJunge

Gast
Hallihallo,

ich hab mir mal eben ein kleines Soundboard geschrieben welches soweit auch funktioniert.
Um das Ganze einfach zu halten, habe ich die portable VLC Version eingebunden.
Jetzt habe ich nur leider das Problem, dass das VLC Fenster sich nicht automatisch minimieren lässt.
protected void t1(object sender, EventArgs e)
{
Process p = new Process();
p.StartInfo.WorkingDirectory = @"VLCPortable";
p.StartInfo.FileName = "VLCPortable.exe";
p.StartInfo.Arguments = "LINK/PFAD";
p.Start();
}
der Versuch es vor dem "Process.Start" festzulegen (p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;) klappt leider nicht.
Daher wollte ich fragen, wie ich es entweder vor dem Start festlegen könnte ODER ob ich das VLC Fenster einfach nachträglich irgendwie minimieren könnte.
Danke schonmal
 
Zuletzt bearbeitet von einem Moderator:
p.StartInfo.Arguments = "--qt-start-minimized URL"; hab dabei leider dan Phänomen, dass VLC sich zwar minimiert startet (und in Windows 10 auch diese komische Benachrichtigung kommt) aber es kurz darauf wieder im normalem Fenster erscheint.
 
Eine Methode die funktioniert wäre per PInvoke über user32.dll das Fenster zu minimieren, dazu musst du dir über den Process,den du startest einfach nur die Handle holen und mit der Handle dann über die Windows user32 API das Fenster minimieren.

handle bekommst du einfach mit:

IntPtr hWnd = p.MainWindowHandle;

der PInvoke

[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(int hWnd, int nCmdShow);

Die passende Enum für die nCmdShow

public enum SW : int
{
HIDE = 0,
SHOWNORMAL = 1,
SHOWMINIMIZED = 2,
SHOWMAXIMIZED = 3,
SHOWNOACTIVATE = 4,
SHOW = 5,
MINIMIZE = 6,
SHOWMINNOACTIVE = 7,
SHOWNA = 8,
RESTORE = 9,
SHOWDEFAULT = 10
}
 
Ich fand den Ansatz es programmiertechnisch zu lösen, erstmal sehr interessant. Ich habe entsprechend die Prozesserstellung ausgelagert

[DllImport("user32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

public static void vlc(string vlc_argument)
{
Process p = new Process();
p.StartInfo.WorkingDirectory = @"VLCPortable";
p.StartInfo.FileName = "VLCPortable.exe";
p.StartInfo.Arguments = vlc_argument;
p.Start();
IntPtr hWnd = p.MainWindowHandle;
ShowWindowAsync(hWnd, 2);
}

und füttere VLC nun im onClick Event mit

protected void t1(object sender, EventArgs e)
{
vlc("https://www.youtube.com/watch?v=wyz_2DEah4o");
}

Ich nehme aber an, dass ich das mit pinvoke falsch verstanden habe, weil es nicht funktioniert bei mir ^^
 
Man sollte meiner Erfahrung nach bei PInvoke 2 Dinge beachten, Timing und dass man einen Fernzugriff auf ein Programm macht.

Daher würde ich Prozessstart und Minimierung trennen, alternativ ein WaitForIdle einbauen. Falls du versuchst zu minimieren, wenn das Programm noch nicht bereit ist, könnte das ohne Effekt bleiben.

[DllImport("user32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
public void MinimizeWindow(IntPtr hWnhd)
{
ShowWindowAsync(hWnd, 6); //Minimize müsste 6 sein
}
IntPtr hWnd;
public static void vlc(string vlc_argument)
{
Process p = new Process();
p.StartInfo.WorkingDirectory = @"VLCPortable";
p.StartInfo.FileName = "VLCPortable.exe";
p.StartInfo.Arguments = vlc_argument;
p.Start();
hWnd = p.MainWindowHandle;
}


zu einem späteren Zeitpunkt, wenn du dir sicher sein kannst, dass das externe Programm läuft

MinimizeWindow(hWnd);
 
Schau dir mal den Wert von p.MainWindowHandle an. Der dürfte direkt nach dem Start 0 sein, da das Fenster noch nicht vorhanden ist. Du müsstest den API-Aufruf also ein klein wenig verzögern.


Und in Zukunft bitte die Code-Tags nutzen:
Code:
Console.WriteLine("Hallo Welt");

{
    //Auch Einrückung funktioniert dann;
    p.MainWindowHandle;
}
 
Für sowas simples tuts auch ein powershell script:
Code:
& "C:\Program Files\VideoLAN\VLC\vlc.exe" --qt-start-minimized --novideo "https://www.youtube.com/watch?v=wyz_2DEah4o"
Ohne video output bleibt vlc auch minimiert.
 
Zurück
Oben