Pregunta

Quiero saber cómo puedo comprobar 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 y c: \ LOC2 \ test.exe. Yo sólo quería saber si c: \ LOC1 \ test.exe se está ejecutando y no todos los casos de test.exe

.
¿Fue útil?

Solución

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

Otros consejos

Esta 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 utilizarlo como:

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

probar esto ... lo uso para determinar al inicio si otro proceso ya se está ejecutando con el mismo nombre que el archivo ejecutable que estoy tratando de empezar, y luego acaba de llegar a que uno de primer plano, (y para enfocar) si ya se está ejecutando ... se podría modificarlo para tener un nombre de proceso y la prueba de que el nombre específico ... Esto le dirá si hay un proceso que se ejecuta con un cierto nombre, pero no en ese proceso se cargó desde .. .

Si hay un proceso que se ejecuta con el nombre especificado, entonces si ese proceso tenía un método accesible a la vista que devuelve en la que se carga desde, podría llamar a ese método en el proceso en ejecución, de lo contrario, no sé ..

Sin embargo, sólo por curiosidad, ¿por qué te importa, a menos que sean diferentes? Y si son diferentes de alguna manera, código usar esa diferencia (cualquiera que sea) para detectar que se carga. Pero si son de la misma forma en la que puede importar en el disco se utilizó la imagen para cargarla?

    [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;
    }

Usted debe iterar sobre todos los procesos existentes y luego verificar su propiedad MainModule para el nombre del 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...
   }
}

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

Algo como esto. GetMainModuleFileName ayuda a acceder proceso de x64 x86.

  [DllImport("kernel32.dll")]
  public static extern bool QueryFullProcessImageName(IntPtr hprocess, int dwFlags, StringBuilder lpExeName, out int size);

  private bool CheckRunningProcess(string processName, string path) {

  Process[] processes = Process.GetProcessesByName(processName);
  foreach(Process p in processes) {
    var name = GetMainModuleFileName(p);
    if (name == null)
      continue;
    if (string.Equals(name, path, StringComparison.InvariantCultureIgnoreCase)) {
      return true;
    }
  }
  return false;
}

// Get x64 process module name from x86 process
private static string GetMainModuleFileName(Process process, int buffer = 1024) {

  var fileNameBuilder = new StringBuilder(buffer);
  int bufferLength = fileNameBuilder.Capacity + 1;
  return QueryFullProcessImageName(process.Handle, 0, fileNameBuilder, out bufferLength) ?
      fileNameBuilder.ToString() :
      null;
}

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

System.Reflection.Assembly.GetEntryAssembly()

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top