132 votes

C #: Comment obtenir le chemin complet du processus en cours?

Je vais avoir une application qui est en train de changer certains paramètres d'une autre application (c'est une simple application en C# qui l'exécuter en double-cliquant (aucune installation nécessaire)).

Après avoir modifié les paramètres j'ai besoin de redémarrer l'application de sorte qu'il reflète les paramètres modifiés.

Pour ce faire, je dois tuer les processus en cours d'exécution et recommencer le processus, Mais le problème, c'est après avoir tué je ne suis pas en mesure de trouver le processus. (La raison est le système ne sais pas où le fichier exe est..)

Est-il possible de trouver le chemin des processus en cours d'exécution ou exe, s'il est en cours d'exécution?

Je ne veux pas donner de chemin manuellement, c'est à dire si elle est en cours d'exécution obtenir le chemin, pour tuer l'proccess et recommencer autre chose .... Je m'occupe plus tard

204voto

  //using System.Diagnostics;

 Process process = GetProcessHowever();  // Process.GetProcesses(); if you dont have.
 string fullPath = process.Modules[0].FileName;

 //fullPath has the path to exe.
 

Il y a un inconvénient avec cette API: si vous exécutez ce code dans une application 32 bits, vous ne pourrez pas accéder aux chemins des applications 64 bits. Il vous faudra donc compiler et exécuter votre application en tant qu'application 64 bits. (Propriétés du projet -> Construire -> Cible de la plateforme -> x64)

119voto

Jeff Mercado Points 42075

Ce que vous pouvez faire est d'utiliser WMI pour obtenir les chemins. Cela vous permettra d'obtenir le chemin d'accès quel que soit c'est un 32 bits ou en 64 bits. Voici un exemple montrant comment vous pouvez l'obtenir:

// include the namespace
using System.Management;

var wmiQueryString = "SELECT ProcessId, ExecutablePath, CommandLine FROM Win32_Process";
using (var searcher = new ManagementObjectSearcher(wmiQueryString))
using (var results = searcher.Get())
{
    var query = from p in Process.GetProcesses()
                join mo in results.Cast<ManagementObject>()
                on p.Id equals (int)(uint)mo["ProcessId"]
                select new
                {
                    Process = p,
                    Path = (string)mo["ExecutablePath"],
                    CommandLine = (string)mo["CommandLine"],
                };
    foreach (var item in query)
    {
        // Do what you want with the Process, Path, and CommandLine
    }
}

Notez que vous aurez à faire référence à l' System.Management.dll montage et l'utilisation de l' System.Management d'espace de noms.

Pour plus d'info sur ce que les autres informations vous pouvez vous saisir de ces processus tels que la ligne de commande utilisée pour lancer le programme (CommandLine), voir le Win32_Process classe et WMI .NET pour plus d'informations.

25voto

Thalur Points 656

Je suppose que vous avez déjà l’objet processus du processus en cours (par exemple, par GetProcessesByName ()). Vous pouvez alors obtenir le nom du fichier exécutable en utilisant

 Process p;
string filename = p.MainModule.FileName;
 

8voto

Mc_Topaz Points 21

En combinant les réponses de Sanjeevakumar Hiremath et de Jeff Mercado, vous pouvez en quelque sorte contourner le problème lorsque vous récupérez l'icône d'un processus 64 bits dans un processus 32 bits.

 using System;
using System.Management;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int processID = 6680;   // Change for the process you would like to use
            Process process = Process.GetProcessById(processID);
            string path = ProcessExecutablePath(process);
        }

        static private string ProcessExecutablePath(Process process)
        {
            try
            {
                return process.MainModule.FileName;
            }
            catch
            {
                string query = "SELECT ExecutablePath, ProcessID FROM Win32_Process";
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);

                foreach (ManagementObject item in searcher.Get())
                {
                    object id = item["ProcessID"];
                    object path = item["ExecutablePath"];

                    if (path != null && id.ToString() == process.Id.ToString())
                    {
                        return path.ToString();
                    }
                }
            }

            return "";
        }
    }
}
 

Cela peut être un peu lent et ne fonctionne pas sur tous les processus dépourvus d'icône "valide".

-3voto

Daren Thomas Points 26812

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X