Frage

Es gibt jede Befehlszeile oder .NET-Methode, die einen Prozess im Hintergrund läuft versteckt jedes Fenster, um es zu öffnen versucht?

Bereits versucht:

 var process = new Process()
 {
      StartInfo = new ProcessStartInfo()
      {
          CreateNoWindow = true,
          WindowStyle = ProcessWindowStyle.Hidden,
          FileName = TheRealExecutableFileNameHere
      }
 }
 process.Start();

Ohne Erfolg bisher

War es hilfreich?

Lösung

Überprüfen Sie die Matlab Motor aus.

Es gibt sogar eine interessante Artikel auf Codeproject, wenn dieser Ansatz Ihren Bedürfnissen entspricht .

Andere Tipps

prüfte ich meinen Code und es sieht fast identisch mit Ihnen:

ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments)
{
   CreateNoWindow = true,
   WindowStyle = ProcessWindowStyle.Hidden,
   UseShellExecute = false,
   RedirectStandardOutput = true                                               
};

Process process = Process.Start(psi);

Den einzigen nennenswerten Unterschied (außer Formatierung und PSI-Konstruktor den wir gewählt haben) ist meine Verwendung von UseShellExecute und RedirectStandardOutput als ich brauchte, um das Ergebnis des RAN Prozesses zu lesen.

Ich habe den obigen Code konsequent betreibt einen versteckten Prozess auf XP und Vista gefunden. Ich habe aber auch gefunden, und Sie können das gleiche erleben, dass ein versteckter Prozess einen anderen Prozess beginnen kann standardmäßig, die nicht verborgen ist. Mit anderen Worten, wenn Sie versteckte Prozess A und Prozess A starten, die wiederum schlägt Verfahren B aus, Sie haben keine Kontrolle darüber, wie Verfahren B angezeigt wird. Fenster, die Sie haben keine Kontrolle über angezeigt werden.

Ich hoffe, das hilft ein wenig. Viel Glück.

Haben Sie versucht, das Microsoft DOS mit Start Befehl mit den / B Schaltern?

Microsoft DOS-Befehl starten

Beispiel:

START /B cmd.exe

Es gibt kein Ich weiß nicht, einen reinen .NET-Weg, dies zu erreichen.

Dann dachte ich über Kernel Job Objects , aber keine ähnliche Option in UI Einschränkungen gefunden .

Also, das nächste ( noch nicht verifizierten ) Idee ist als Prozess zu schaffen suspendiert, erstellen Fenster Haken dann, die überwachen CallWndProc und auszufiltern WM_SHOW Nachrichten. (Dann, sicher, um den Prozess wieder aufzunehmen, in einem separaten Thread warten, bis es beendet wird, entfernen Sie den Haken)

Sie können die Background Klasse versuchen in .NET Framework, wenn Sie nicht bereits haben. Es ist für die Ausführung lange laufende Prozesse auf einem separaten Thread zu verhindern, dass die Benutzeroberfläche zu behindern. Geben Sie ihm einen Blick zu.

Ich weiß, das beantwortet wurde, aber man könnte ein Fenster zwingen, nicht verwalteten Anrufe Find und Showwindow zu verbergen.

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

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

psi = new ProcessStartInfo(); // etc..
some_process = Process.Start(psi);
System.Threading.Thread.Sleep(50); // need give the window a chance to be created
IntPtr hWnd = FindWindow(null, "name of the window");
if (hWnd != IntPtr.Zero) ShowWindow(hWnd, 0); // 0 = SW_HIDE

Rather kludgy.

Es hängt davon ab, ob Sie die Anwendung minimiert starten, sondern er kann auch mit dem Benutzer zu interagieren, wenn erforderlich, oder wenn Sie den gesamten Zugriff mit dem Benutzer verbieten wollen, unabhängig davon, was passiert.

Wenn letzteres, können Sie den Prozess unter einem anderen Desktop-Kontext des aktuellen Benutzers ausgeführt werden können.

Verschiedene Desktop-Kontexte verwendet werden, beispielsweise durch den Login-Dialog und von Vista UAC -. Alles, was in einem Desktop-Kontext geschieht, ist unabhängig von anderen

Könnte obwohl ein Vorschlaghammer Ansatz für das Problem sein.

Ich habe bemerkt, dass, wenn CreateNoWindow = false absolut nichts, wenn der Dateiname auf eine ausführbare Windows-Datei verweist, wenn Sie Zugriff auf den Quellcode der winform App haben, dann könnten Sie in der Lage sein, ein Befehlszeilenargument zu schaffen, die die Standard-Steuerung Sichtbarkeit der Form und in dem Winform App Startup-Code so etwas tun:

static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Form1 form1 = new Form1();

        form1.Load += new EventHandler((s,o) =>
            {
              //check if the form should be shown based on command line arg
                if (args.Contains("dontShowWindow"))
                {
                    //hide it
                    form1.ShowInTaskbar = false;
                    form1.Visible = form1.ShowInTaskbar = false;
                }
            }
        );
        Application.Run(form1);
    }

Sie Code aufrufen, können Sie nun festlegen, "dontShowWindow" als Prozess Argument:

 ProcessStartInfo info = new ProcessStartInfo
        {
            CreateNoWindow = false, 
            WindowStyle = ProcessWindowStyle.Hidden,
            UseShellExecute = false, 
            FileName = @"C:\temp\testWinForm.exe",
            Arguments = "dontShowWindow"
        };
        Process.Start(info);

Hope, das hilft

Ein sehr einfach Weg, um dies zu erreichen, ist ein Dienstkonto zu erstellen und die ausführbare Datei in dem Kontext des Dienstkonto Benutzers über den Windows-Taskplaner ausgeführt werden.

Sie können diese Codeproject-Setup verwenden, um die geplante Aufgabe:

http://www.codeproject.com/KB/cs/tsnewlib.aspx

Sie können das Dienstkonto programmatisch in der Domäne oder lokalen Rechner sehr einfach mit C # erstellen.

http://www.codeproject.com/KB/system/OSUserMangement.aspx http://support.microsoft.com/kb/306273

Prozesse als geplante Aufgaben im Rahmen eines anderen Benutzers ausgeführt wird nicht angezeigt werden, interaktiv, es sei denn, dass Benutzer angemeldet ist; daher die Verwendung eines Dienstkontos.

public Form1()
    {
        InitializeComponent();
        Form1 fm = new Form1();
        fm.ShowInTaskbar = false;
        fm.Visible = fm.ShowInTaskbar = false;
    }

Funktioniert prima!

Ich gehe davon aus Sie einen Prozess wollen, dass die Benutzer nicht sichtbar ist beim Laufen.

Sie können versuchen, die folgenden zu sehen, ob das ist, was Sie wollen.

  1. Erstellen Sie eine einfache Konsolenanwendung, die am Laufen hält (und starten Sie es zu testen).
  2. Recht auf Projekt klicken -> Eigenschaften -> Registerkarte Anwendung -> Ausgabetyp -> ändern Sie es aus "Console Application" auf Windows-Anwendung
  3. .
  4. Starten Sie die gleiche App noch einmal (um zu sehen, ob das ist, was Sie wollen).
  5. Schließen Sie die App über den Windows Task-Manager:)

Es scheint, dass der Prozess im Task-Manager angezeigt wird, doch ist in der Taskleiste nicht sichtbar. Alt + TAB kann diesen Prozess nicht bringen.

Ich hoffe nur, dass Sie keine bösartige App machen, aber:)

Ich denke, was Sie vielleicht versuchen, eine neue Windows-Station zu erstellen. Schauen Sie sich diesen Artikel, die ein wenig über sie auf Msdn erklärt.

http://msdn.microsoft.com /en-us/library/ms681928(VS.85).aspx

Sie können einen Windows-Dienst machen. Jedes Fenster ein Dienst zu öffnen versucht, läuft gerade in Sitzung 0, was bedeutet, dass kein Benutzer sie sehen kann. Das gilt für alle Fenster aber, so das ist vielleicht nicht das, was Sie suchen.

Im Folgenden Code für mich gearbeitet: Früher verwendetes Verfahren (Notizblock), um den Notizblock auf Desktop-Bildschirm für den Druck zu blinken, aber es den Benutzer ablenken, so unten Code des Notizblock Prozess im Hintergrund versteckt.

                System.Windows.Forms.PrintDialog printDialog = new PrintDialog();
                System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt");
                psi.Verb = "PRINT";

                //Process.Start(psi);
                //psi.CreateNoWindow = true;
                psi.UseShellExecute = false;
                //---------------------------------------------------

                psi.CreateNoWindow = false;
                psi.UseShellExecute = true;
                psi.FileName = Application.StartupPath + "/PrintingDocketFile/PrintCustomerOrder.txt";
                psi.WindowStyle = ProcessWindowStyle.Hidden;
                psi.Arguments =  @"%windir%\system32\notepad.exe"; 
                //Process.Start(psi);
                //------------------------------------------------------

                /////////////////////----------------------------------

                printProcess.StartInfo = psi;
                /////psi.CreateNoWindow = true;

                //psi.FileName = "Application.StartupPath" + "/PrintingDocketFile/PrintCustomerOrder.txt";
                //p.StartInfo.FileName = "Notepad.EXE";
                //p.StartInfo.Arguments = "/i /q \"" + installationPackages[i] + "\"";

                printProcess.Start();

                /////////////////////////-------------------------------
                while (!printProcess.HasExited) ;


                if (!printProcess.HasExited)
                {
                    printProcess.Close();
                }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top