Frage

Ich möchte wissen, wie ich ein Programm in einem bestimmten Ort überprüfen können, ob er ausgeführt wird. Zum Beispiel gibt es zwei Standorte für test.exe in c: \ loc1 \ test.exe und c: \ loc2 \ test.exe. Ich wollte nur, wenn c wissen:. \ Loc1 \ test.exe läuft und nicht alle Instanzen von test.exe

War es hilfreich?

Lösung

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

Andere Tipps

Das ist meine verbesserte Funktion:

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

und verwenden Sie es als:

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

versuchen, diese ... Ich benutze es beim Start, um zu bestimmen, ob ein anderer Prozess bereits mit dem gleichen Namen wie die exe ausgeführt Ich versuche zu starten, und dann bringen Sie nur, dass man in den Vordergrund, (und Fokus), wenn es läuft bereits ... Sie könnten es ändern für diesen bestimmten Namen einen Prozessnamen und Test nehmen ... Dies wird Ihnen sagen, ob es einen Prozess mit einem bestimmten Namen läuft, aber nicht, wo dieser Prozess geladen wurde .. .

Wenn es ein Prozess mit dem angegebenen Namen läuft, dann, wenn das Verfahren eine exponierte zugängliche Methode hatte, dass die Renditen, woher es geladen wurde, können Sie diese Methode auf dem laufenden Prozess nennen, sonst, ich weiß nicht ..

Aber nur aus Neugier, warum fragst du, es sei denn, sie sind anders? Und wenn sie in irgendeiner Weise anders sind, Code, diesen Unterschied zu verwenden (was auch immer es ist) zu erkennen, welche geladen wird. Aber wenn sie das gleiche sind, wie kann es eine Rolle, welche auf der Platte wurde Bild verwendet, es zu laden?

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

Sie sollten über alle bestehenden Prozesse durchlaufen und überprüfen ihre MainModule Eigenschaft für die Dateinamen, die Sie suchen. So etwas wie diese

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...
   }
}

Diese Funktion kann helfen:

using System.Diagnostics;

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

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

So etwas wie dies. GetMainModuleFileName hilft den Zugriff auf x64-Prozess von 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;
}

könnten Sie verwenden einen benannten Mutex , das ist in der Verzeichnisstruktur das Programm läuft genannt wird.

System.Reflection.Assembly.GetEntryAssembly()

Dies wird für Sie bringt eine Menge Informationen über den Zugangsaufbau, wie zum Beispiel:

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

Dieses erklärt die Position der Lauf Montage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top