2010-04-22 8 views
0

J'ai simple application win (écrit en utilisant. NET C#) qui doit être démarré à partir de cmd.exe, puis écrire sur cette console, mais le problème est que j'ai besoin de processus ID de ce processus cmd.exe. Je peux obtenir tous les processus en cours d'exécution,Comment trouver l'ID de processus cmd.exe à partir de quelle application est démarrée?

Process[] procList = Process.GetProcessesByName("cmd"); 

mais comment trouver mon? :)

Peut-être lire l'entrée, et vérifier est "ApplicationName.exe" écrit à l'intérieur, ou pour obtenir la fenêtre cmd.exe actuellement active? Mais avec quelle fonction?

+0

Pourquoi une application Windows doit-elle réécrire dans une fenêtre de console?Pourquoi ne pas simplement faire apparaître un formulaire non-modal dans l'application Windows et y mettre la sortie? Comment pouvez-vous garantir que l'application Windows a même été démarrée à partir d'une fenêtre cmd.exe? –

+0

Processus parent? – leppie

+0

Dupliquer de: http://stackoverflow.com/questions/394816/how-to-get-parent-process-in-net-in-managed-way –

Répondre

0

Même si vous trouvez "vôtre" cmd, comment allez-vous écrire dedans?

Il existe une meilleure façon de réaliser ce que vous décrivez. Il suffit de compiler votre projet en tant que "Application console", mais de créer une fenêtre WinForms. Oui, c'est possible, rien ne vous en empêche. Ensuite, vous seriez en mesure d'écrire sur la console en utilisant votre classe System.Console, pas de magie nécessaire.

0

Le code suivant crée une requête d'événement WQL pour détecter un nouveau processus, attend un nouveau processus pour démarrer et affiche ensuite les informations sur le processus:

WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1), "TargetInstance isa \"Win32_Process\""); 
ManagementEventWatcher watcher = new ManagementEventWatcher(query); 
ManagementBaseObject e = watcher.WaitForNextEvent(); 
Console.WriteLine("Process {0} has been created, path is: {1}", 
((ManagementBaseObject)e["TargetInstance"])["Name"], 
((ManagementBaseObject)e["TargetInstance"])["ExecutablePath"]); 
watcher.Stop(); 

Je pense que vous pouvez trouver une solution à votre problème en examinant cet exemple de code WMI. J'espère que cela aide.

0

Ajouter cette fonction quelque part dans une classe à votre projet: (nécessite un using System.Runtime.InteropServices; au-dessus de la classe)

[DllImport("kernel32.dll")] 
    private static extern bool AttachConsole(int dwProcessId); 
    [DllImport("kernel32.dll")] 
    private static extern bool FreeConsole(); 

Alors appelez AttachConsole(-1) Maintenant, vous pouvez utiliser la classe System.Console comme d'habitude d'écrire à la console et définir les couleurs et autres joyeusetés. Si vous n'avez plus besoin d'écrire sur la console, appelez le FreeConsole() pour détacher votre processus. Sachez que cela n'empêche pas la console de traiter d'autres commandes.

L'utilisateur est toujours autorisé à entrer n'importe quoi dans la console à tout moment.

La méthode recommandée est la suivante:

  1. Créer une application console
  2. Ecrire à ce que vous voulez.
  3. Appelez FreeConsole() dès que vous n'en avez plus besoin.
  4. Ouvrez votre formulaire en utilisant Application.Run(). Ne pas utiliser application.Run et afficher uniquement le formulaire ne crée pas une boucle de message appropriée et des choses étranges peuvent se produire.

Vous pouvez basculer entre 3 et 4, mais dès que vous appelez la méthode Application.Run, le code ne continuera pas tant que le formulaire n'est pas fermé. Donc, soit écrire dans la console dans le formulaire et le libérer à partir de là ou engendrer le formulaire dans un thread séparé (qui a d'autres conséquences secondaires inattendues)

Vous pouvez fournir n'importe quel ID de processus à la fonction AttachConsole. -1 par défaut au processus parent qui est probablement ce que vous voulez.