Überprüfen Sie, ob eine bestimmte EXE-Datei ausgeführt wird
-
20-09-2019 - |
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
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;
}
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.