C # - Einführung Invisible Verfahren (? CreateNoWindow & Window nicht funktioniert)
-
26-09-2019 - |
Frage
Ich habe 2 Programme (.exe), die ich in .NET erstellt haben. Wir werden sie der Meister nennen und der Arbeiter. Der Master startet 1 oder mehr Arbeiter. Der Arbeiter wird nicht mit vom Benutzer interagiert werden, aber es ist eine WinForms-Anwendung, die WinForms-Befehle und laufen Komponenten auf der Grundlage der von ihm empfangenen Befehlen aus dem Master.
erhältIch möchte die Arbeiter App laufen vollständig versteckt (außer im Task-Manager natürlich zeigt nach oben). Ich dachte, dass ich dies mit dem erreichen konnte StartInfo.CreateNoWindow und StartInfo.WindowStyle Eigenschaften, aber ich habe noch die Client.exe Fenster und Komponenten in Form sehen. Doch es zeigt nicht in der Taskleiste auf.
Process process = new Process
{
EnableRaisingEvents = true,
StartInfo =
{
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
FileName = "Client.exe",
UseShellExecute = false,
ErrorDialog = false,
}
};
Was muss ich tun, um Client.exe laufen zu lassen, aber nicht angezeigt?
Lösung
Ihre Nutzung von CreateNoWindow
/ WindowStyle
funktioniert gut auf meinem System mit notepad.exe (z es versteckt ist, aber im Hintergrund läuft), so ist es wahrscheinlich etwas die WinForms-Anwendung tut. Einige Ideen:
Option 1: Wenn Sie den WinForms Arbeitsprozess steuern, können Sie a href außer Kraft setzen <= "http://msdn.microsoft.com/en-us/library/system.windows.forms .control.setvisiblecore.aspx“rel = "noreferrer"> Control.SetVisibleCore
versteckt immer das Formular aus. Wenn Sie es nicht wollen, immer verbergen, können Sie ein Befehlszeilenargument, um es passieren, z.B. /hide
, die es wird dazu führen, ausgeblendet werden. Beispiel (vorausgesetzt, es ist bereits Code-Behind für die Form):
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
}
protected override void SetVisibleCore(bool value)
{
// You'd probably want to parse the command line.
if (Environment.CommandLine.Contains("/hide"))
base.SetVisibleCore(false);
else
base.SetVisibleCore(value);
}
}
Damit MyForm.exe
Ergebnisse in einem Prozess mit einer sichtbaren Form ausgeführt wird. Lauf MyForm.exe /hide
führt zu einem Prozess mit einer versteckten Form. Sie könnten das /hide
Argument von Ihrem Master-Prozess übergeben, so dann auch normale Benutzer die Anwendung ausgeführt werden sehen, es immer noch.
Option 2: Sie können die Anwendung verstecken, nachdem sie beginnt mit einem P tun / Invoke auf ShowWindow
. Weitere Informationen über dieses hier . Dies hat den Nachteil, dass man manchmal die Arbeiter Fenster flackern in Existenz, bevor sie versteckt sehen. Beispiel:
class Program
{
public static void Main(string[] args)
{
ProcessStartInfo psi = new ProcessStartInfo()
{
FileName = @"C:\windows\system32\notepad.exe",
};
Process process = Process.Start(psi);
// Wait until the process has a main window handle.
while (process.MainWindowHandle == IntPtr.Zero)
{
process.Refresh();
}
ShowWindow(process.MainWindowHandle, SW_HIDE);
}
const int SW_HIDE = 0;
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}
Andere Tipps
Das Problem mit UseShellExecute = false
ist, stellen Sie hier true
und der Prozess wird gestartet als versteckt. Verwenden der Shell zum Starten des Prozesses versteht, wie die Anwendung machen versteckt, wo, wie der Prozess direkt mit UseShellExecute = false
Starten des Prozesses direkt gestartet wird, und wie Chris Schmich erwähnt, würden Sie behandeln müssen versteckt das Fenster aus dem Inneren der Client-Anwendung. Dies könnte wünschenswerter sein, wenn Sie die Option wollen die Anwendung ausgeführt wird manuell für das Debuggen oder Testzwecke.
Sie müssen hinzufügen base.Visibility = Visibility.Hidden;
in Win Form Anwendungskonstruktor.