2010-08-09 28 views
15

Avant de dire que c'est une question en double, laissez-moi vous expliquer (comme j'ai lu tous les sujets similaires).Masquer la fenêtre de commande en C# Application

Mon application a ces deux paramètres:

procStartInfo.CreateNoWindow = true; 
    procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

et est a aussi WindowsApplication que le type de sortie.

La fenêtre noire apparaît quand j'appelle une commande de ligne de commande. Y a-t-il autre chose que je puisse faire pour cacher la fenêtre? Cela ne se produit pas pour toutes les commandes, XCOPY est une situation où la fenêtre noire clignote. Cela ne se produit que lorsque la destination que je suis XCOPYing contient déjà le fichier et il me demande si je veux le remplacer. Même si je passe/Y, il clignotera encore brièvement.

Je suis ouvert à l'utilisation de vbscript si cela peut aider, mais d'autres idées?

Le client va appeler mon exécutable, puis passer dans une commande de ligne de commande par exemple:

C:\MyProgram.exe start XCOPY c:\Test.txt c:\ProgramFiles\

Voici le code complet de l'application:

class Program 
{ 
    static void Main(string[] args) 
    {  
      string command = GetCommandLineArugments(args); 

      // /c tells cmd that we want it to execute the command that follows and then exit. 
      System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c " + command); 

      procStartInfo.RedirectStandardOutput = true; 
      procStartInfo.UseShellExecute = false; 

      // Do not create the black window. 
      procStartInfo.CreateNoWindow = true; 
      procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

      System.Diagnostics.Process process = new System.Diagnostics.Process(); 
      process.StartInfo = procStartInfo; 
      process.Start(); 

     } 

    private static string GetCommandLineArugments(string[] args) 
    { 
     string retVal = string.Empty; 

     foreach (string arg in args) 
      retVal += " " + arg; 


     return retVal; 
    } 
} 
+0

Pouvez-vous poster le reste de votre 'processus' /' ProcessStartInfo' c ode? –

+3

@fletcher: Il est indiqué dans la question que le type de sortie est Windows Application et non la console. Je l'ai testé avec le type de sortie défini sur l'application Windows et cela fonctionne très bien. @snow: Je vérifierais votre paramètre OutputType. – nukefusion

+0

@fletcher C'est en fait un peu le problème! Je voudrais que la fenêtre ne s'affiche pas du tout! – mint

Répondre

9

Le problème est que vous utilisez cmd.exe. Seulement sa fenêtre de console sera cachée, pas la fenêtre de console pour le processus que vous lui demandez de commencer. Il est inutile d'utiliser cmd.exe, sauf si vous essayez d'exécuter certaines des commandes qu'il implémente lui-même. Comme COPY.

Vous pouvez toujours supprimer la fenêtre si vous avez besoin de cmd.exe, vous devrez utiliser l'option/B pour démarrer. Tapez start /? à l'invite de commande pour voir les options. Pas que cela aide, vous ne pouvez pas utiliser START COPY.

Il y a une anomalie spécifique dans xcopy.exe qui peut aussi vous rebuter. Il ne s'exécute pas si vous ne redirigez pas également l'entrée. Il ne fonctionne tout simplement pas sans diagnostic.

+0

le/B a travaillé pour la commande xcopy, c'est peut-être tout ce dont nous avons besoin pour être honnête – mint

4

Je vois que vous appelez cmd et en passant la commande en tant que paramètres. Au lieu de cela, appelez directement la commande

par exemple.

System.Diagnostics.ProcessStartInfo procStartInfo = new System.DiagnosticsProcessStartInfo("xcopy", "<sourcedir> <destdir> <other parameters>"); 

procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
+0

Je devrais probablement avoir déclaré cela dans la question, mais le client passera dans n'importe quelle commande de ligne de commande qu'il veut mon programme, donc je ne peux pas coder dur xcopy, encore vous réécouté! – mint

+1

@Snow, vous pouvez toujours faire ce qu'il dit, 'ProcessStartInfo procStartInfo = nouveau ProcessStartInfo (Arg [0], String.Join (" ", Arg.Skip (1) .ToArray());' –

+0

@snow xcopy était juste par exemple –

4

Vous pouvez essayer d'ajouter

process.StartInfo.UseShellExecute = false; 

à votre processus

+2

Pour clarifier la réponse, vous avez besoin de 'process.StartInfo.UseShellExecute = false; 'et' process.StartInfo.CreateNoWindow = false; 'Ces deux ensemble masqueront la fenêtre de processus –

+1

@ Rémi: vous avez besoin de 'process.StartInfo.CreateNoWindow = true;' – Sjoerd222888

+0

Je reçois l'erreur "Le système ne trouve pas le fichier spécifié. "C'est même si j'ai ajouté la commande personnalisée à la variable système PATH. – Najeeb

0

J'ai eu une tâche similaire - Il est possible de cacher la fenêtre après la création via un appel API. (Dans votre cas, vous avez peut-être besoin d'un fil d'assistance.)

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

Si vous connaissez la poignée de la nouvelle fenêtre, vous pouvez appeler

ShowWindow(hWnd, 0); 

0 cache la fenêtre, 1 montre la fenêtre

Pour la poignée de la fenêtre jeter un oeil à:

pinvoke.net enumwindows(user32)