2009-11-16 15 views
29

Quiero saber cómo puedo verificar un programa en una ubicación específica si se está ejecutando. Por ejemplo, hay dos ubicaciones para test.exe en c: \ loc1 \ test.exe yc: \ loc2 \ test.exe. Solo quería saber si se está ejecutando c: \ loc1 \ test.exe y no todas las instancias de test.exe.Comprueba si se está ejecutando un archivo exe específico

Respuesta

45
bool isRunning = Process.GetProcessesByName("test") 
       .FirstOrDefault(p => p.MainModule.FileName.StartsWith(@"c:\loc1")) != default(Process); 
+0

gracias, esto es exactamente lo que estoy buscando. – murasaki5

+5

Buena respuesta, aunque ** tenga en cuenta ** que si está utilizando algo similar a '..StartsWith (new FileInfo (Application.ExecutablePath) .DirectoryName)' no funcionará. Esto porque _DirectoryName_ devuelve la ruta con una letra de unidad minúscula como ** c: **. Por lo tanto, es una buena idea modificarlo como '..FileName.ToLower()' y '..StartsWith (@ path.ToLower())'. –

+6

Es mejor hacer una comparación insensible a mayúsculas y minúsculas (por ejemplo, usando '.StartsWith (ruta, StringComparison.InvariantCultureIgnoreCase)' realmente porque no implica mutar las cadenas. – Ben

5

intente esto ... Lo uso para determinar al inicio si ya se está ejecutando otro proceso con el mismo nombre que el exe que estoy tratando de iniciar, y luego simplemente pongo ese en primer plano, (y para enfocar) si ya se está ejecutando ... Puede modificarlo para tomar un nombre de proceso y probar ese nombre específico ... Esto le dirá si hay un proceso ejecutándose con un nombre determinado, pero no desde dónde se cargó ese proceso. ..

Si hay un proceso que se ejecuta con el nombre especificado, entonces si ese proceso tenía un método accesible que muestra de dónde se cargó, puede llamar a ese método en el proceso en ejecución, de lo contrario, no lo hago saber ..

Pero solo por curiosidad, ¿por qué te importa, a menos que sean diferentes? Y si son diferentes de alguna manera, codifique para usar esa diferencia (lo que sea) para detectar cuál se carga. Pero si son lo mismo, ¿cómo puede importar qué imagen en el disco se utilizó para cargarlo?

[DllImport("user32.dll")] 
    private static extern bool SetForegroundWindow(IntPtr hWnd); 
    [DllImport("user32.dll")] 
    private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); 
    [DllImport("user32.dll")] 
    private static extern bool IsIconic(IntPtr hWnd); 

    private const int SW_HIDE = 0; 
    private const int SW_SHOWNORMAL = 1; 
    private const int SW_SHOWMINIMIZED = 2; 
    private const int SW_SHOWMAXIMIZED = 3; 
    private const int SW_SHOWNOACTIVATE = 4; 
    private const int SW_RESTORE = 9; 
    private const int SW_SHOWDEFAULT = 10; 

private static bool IsAlreadyRunning() 
    { 
     // get all processes by Current Process name 
     Process[] processes = 
      Process.GetProcessesByName(
       Process.GetCurrentProcess().ProcessName); 

     // if there is more than one process... 
     if (processes.Length > 1) 
     { 
      // if other process id is OUR process ID... 
      // then the other process is at index 1 
      // otherwise other process is at index 0 
      int n = (processes[0].Id == Process.GetCurrentProcess().Id) ? 1 : 0; 

      // get the window handle 
      IntPtr hWnd = processes[n].MainWindowHandle; 

      // if iconic, we need to restore the window 
      if (IsIconic(hWnd)) ShowWindowAsync(hWnd, SW_RESTORE); 

      // Bring it to the foreground 
      SetForegroundWindow(hWnd); 
      return true; 
     } 
     return false; 
    } 
-1
System.Reflection.Assembly.GetEntryAssembly() 

Esto traerá para usted una gran cantidad de información sobre el conjunto de entrada, tales como:

System.Reflection.Assembly.GetEntryAssembly().CodeBase; 

Esto le indicará la ubicación del conjunto de marcha.

0

Se puede usar un named mutex, que llama así fuera de la estructura de directorios del programa se está ejecutando en

3

Esta función puede ayudar a:.

using System.Diagnostics; 

public bool IsProcessOpen(string name) 
{ 
    foreach (Process clsProcess in Process.GetProcesses()) { 
     if (clsProcess.ProcessName.Contains(name)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

Fuente: http://www.dreamincode.net/code/snippet1541.htm

4

Usted debe iterar sobre todos los procesos existentes y luego verificar su propiedad MainModule para el nombre de archivo que está buscando. Algo como esto

using System.Diagnostics; 
using System.IO; 

//... 

string fileNameToFilter = Path.GetFullPath("c:\\loc1\\test.exe"); 

foreach (Process p in Process.GetProcesses()) 
{ 
    string fileName = Path.GetFullPath(p.MainModule.FileName); 

    //cehck for equality (case insensitive) 
    if (string.Compare(fileNameToFilter, fileName, true) == 0) 
    { 
     //matching... 
    } 
} 
+0

genio! ¡te amo! – Nahum

+0

Intenté su código, pero me encontré con 'Un proceso de 32 bits no puede acceder a los módulos de un proceso de 64 bits' y terminé usando la solución de [http: // stackoverflow.com/questions/5497064/c-how-to-get-the-full-path-of-running-process/5497319 # 5497319] (http://stackoverflow.com/questions/5497064/c-how-to-get -the-full-path-of-run-process/5497319 # 5497319). –

4

Ésta es mi función mejorada:

private bool ProgramIsRunning(string FullPath) 
    { 
     string FilePath = Path.GetDirectoryName(FullPath); 
     string FileName = Path.GetFileNameWithoutExtension(FullPath).ToLower(); 
     bool isRunning = false; 

     Process[] pList = Process.GetProcessesByName(FileName); 
     foreach (Process p in pList) 
      if (p.MainModule.FileName.StartsWith(FilePath, StringComparison.InvariantCultureIgnoreCase)) 
       { 
        isRunning = true; 
        break; 
       } 

     return isRunning; 
    } 

y usarlo como:

ProgramIsRunning(@"c:\loc1\test.exe"); 
+0

¿Dónde está Break? ¿Por qué querríamos recorrer todos los artículos si nuestro proceso puede ser primero desde 300? – Tommix

+0

¡oh! tienes razón. corregido –

Cuestiones relacionadas