2009-05-07 9 views

Répondre

140

Si vous utilisez la classe ProcessStartInfo vous pouvez définir le style de fenêtre cachée:

System.Diagnostics.ProcessStartInfo start = 
     new System.Diagnostics.ProcessStartInfo(); 
start.FileName = dir + @"\Myprocesstostart.exe"; 
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
+18

Juste ce que je devais afficher :) –

+60

Holy crap - quelqu'un plus vite que Jon! =) –

+63

J'ai dû étrangler sa connexion Internet pour le battre;) –

1

Je sais que je ne réponds pas exactement ce que vous voulez, mais je me demande si vous demandez le droit question.

Pourquoi utilisez-vous pas non plus:

  1. service Windows
  2. créer un nouveau thread et exécuter votre processus sur cette

Les sons comme meilleures options si vous voulez tout est à exécuter un processus.

+3

Il existe de nombreux scénarios dans lesquels le lancement d'une application de console utilitaire est parfaitement légitime. –

+0

Dans mon cas, un processus distinct est nécessaire en raison du modèle client/serveur sur lequel le logiciel sur lequel je travaille est utilisé. –

+0

Il ne résout pas toujours le problème pour créer un nouveau thread. Il y a des moments où vous ne voulez tout simplement pas la fenêtre ennuyante en arrière-plan. En outre, si vous avez un process.start dans une boucle, alors vous n'obtiendrez aucun travail lorsque les fenêtres de la console apparaissent sur votre visage. – user890332

20

Vous pouvez utiliser l'API FreeConsole pour détacher la console du processus:

[DllImport("kernel32.dll")] 
static extern bool FreeConsole(); 

(bien sûr cela est applicable que si vous avez accès au code source de l'application de la console)

+0

Je voulais ne pas montrer la console. Bien que 'FreeConsole' fasse ce que son nom indique, cela n'empêche pas Windows d'afficher la console avant qu'elle ne soit appelée. –

+5

Puis compiler le projet comme une application Windows, pas une application de la console –

+0

cela a fonctionné, merci –

4

Si vous Pour créer un programme qui ne nécessite pas de saisie utilisateur, vous pouvez toujours le créer en tant que service. Un service ne montrera aucun type d'interface utilisateur.

+0

Mais si tout ce que vous voulez faire est d'exécuter le processus jusqu'à ce qu'il sorte, par exemple en l'appelant à partir du planificateur de tâches, un service est incommode car il continue d'exister. Dans certaines situations, il est très pratique de changer le type de sortie en application Windows par rapport à l'alternative ProcessWindowStyle. – subsci

171

Si vous avez écrit l'application de la console, vous pouvez la masquer par défaut.

Créer une nouvelle application de la console, puis changez le type « Type de sortie » à « Application Windows » (fait dans les propriétés du projet)

+4

J'essayais de cacher ma propre console, de ne pas appeler autre chose et de la cacher ensuite (comme la réponse acceptée suppose) - donc c'était la meilleure pour moi. Merci! – iamserious

+5

Merci mon pote! C'est ce que je cherchais aussi! – VVV

+2

La réponse acceptée suppose que parce que c'est indiqué dans la question. – aqua

58

Si vous utilisez la classe Process, vous pouvez écrire

yourprocess.StartInfo.UseShellExecute = false; 
yourprocess.StartInfo.CreateNoWindow = true; 

avant yourprocess.start(); et le processus sera caché

+14

La réponse acceptée ne fonctionne pas pour moi. Celui-ci fait. – Otiel

+4

Bonne chance si vous devez arrêter ce processus tôt. Process.Kill se termine brusquement. Process.CloseMainWindow échoue. GenerateConsoleCtrlEvent ne parvient pas à envoyer ctrl + c ou ctrl + break au processus. WM_CLOSE à toutes les fenêtres de thread dans le processus échoue. Il semble qu'il n'y ait aucun moyen de terminer proprement un processus commencé avec ces deux valeurs de paramètres. Voir ma question ici: http://stackoverflow.com/questions/16139571/how-to-cleanly-shut-down-a-console-app-started-with-process-start – Triynko

+0

Merci beaucoup c'était le plus simple. Aussi si vous possédez (ou dépt) le code pour la console j'ai trouvé cet exemple de mutex pour être le plus facile pour l'arrêt propre. http://stackoverflow.com/a/31586184/1877412 – cbuteau

40

La réponse simple est la suivante: Accédez aux propriétés de votre application de console (propriétés du projet). Dans l'onglet "Application", changez simplement le "Type de sortie" en "Application Windows". C'est tout.

+3

Bullseye. Cela revient à créer une application Windows qui n'appelle aucun formulaire. – ashes999

+0

Ceci est la bonne réponse. Aucune de vos autres approches bandaid. C'est la vraie réponse à droite. Vous voulez que votre application n'ouvre jamais une console en premier lieu. En outre, vous voulez être en mesure d'ouvrir un formulaire à tout moment. Alors vous appelez simplement le formulaire quand vous voulez. c'est-à-dire que notre formulaire est appelé lorsque l'utilisateur clique avec le bouton droit sur l'icône de la barre d'état système et sélectionne les préférences. C'EST LA BONNE RÉPONSE !!! – Bluebaron

1

Bien que d'autres réponses aient dit que vous pouvez changer le "Type de sortie" en "Application Windows", sachez que cela signifie que vous ne pouvez pas utiliser Console.In car il deviendra un NullStreamReader.

Console.Out et Console.Error semblent toujours fonctionner correctement.

+1

Êtes-vous sérieux? Pourquoi quelqu'un utiliser 'Console.In' quand il n'y a pas de console pour entrer quelque chose? Où doit-on trouver quelque chose qui peut être consulté via 'Console.In'? Cela n'a aucun sens. En d'autres termes: Il est totalement évident et logique que 'Console.In' soit un' NullStreamReader' dans ce cas. –

+1

@RobertS. Une pipe peut-être. C'est à dire. la sortie d'un autre programme. C'était mon cas d'utilisation quand je l'ai découvert. – kjbartel

7

Si vous êtes intéressé à la sortie, vous pouvez utiliser cette fonction:

private static string ExecCommand(string filename, string arguments) 
{ 
    Process process = new Process(); 
    ProcessStartInfo psi = new ProcessStartInfo(filename); 
    psi.Arguments = arguments; 
    psi.CreateNoWindow = true; 
    psi.RedirectStandardOutput = true; 
    psi.RedirectStandardError = true; 
    psi.UseShellExecute = false; 
    process.StartInfo = psi; 

    StringBuilder output = new StringBuilder(); 
    process.OutputDataReceived += (sender, e) => { output.AppendLine(e.Data); }; 
    process.ErrorDataReceived += (sender, e) => { output.AppendLine(e.Data); }; 

    // run the process 
    process.Start(); 

    // start reading output to events 
    process.BeginOutputReadLine(); 
    process.BeginErrorReadLine(); 

    // wait for process to exit 
    process.WaitForExit(); 

    if (process.ExitCode != 0) 
     throw new Exception("Command " + psi.FileName + " returned exit code " + process.ExitCode); 

    return output.ToString(); 
} 

Il exécute le programme de ligne de commande donnée, attend qu'elle se termine et retourne la sortie sous forme de chaîne.

1

Ajoutez ceci à votre classe pour importer le fichier DLL:

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

    const int SW_HIDE = 0; 
    const int SW_SHOW = 5; 

Et si vous voulez cacher utiliser cette commande:

var handle = GetConsoleWindow(); 
ShowWindow(handle, SW_HIDE); 

Et si vous voulez afficher la console:

var handle = GetConsoleWindow(); 
ShowWindow(handle, SW_SHOW); 
+0

[DllImport ("user32.dll")] statique externe bool ShowWindow (IntPtr hWnd, int nCmdShow); [DllImport ("kernel32.dll")] static extern IntPtr GetConsoleWindow(); const int SW_HIDE = 0; const int SW_SHOW = 5; – soulmachine

0

Il suffit d'écrire

ProcessStartInfo psi= new ProcessStartInfo("cmd.exe"); 
...... 

psi.CreateNoWindow = true; 
0

Sur la base de la réponse d'Adam Markowitz ci-dessus, à la suite travaillé pour moi:

process = new Process(); 
process.StartInfo = new ProcessStartInfo("cmd.exe", "/k \"" + CmdFilePath + "\""); 
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
//process.StartInfo.UseShellExecute = false; 
//process.StartInfo.CreateNoWindow = true; 
process.Start(); 
Questions connexes