Я хочу знать, как я могу проверить программу в определенном месте, если она запущена. Например, есть два места для test.exe в c:\loc1\test.exe и c:\loc2\test.exe. Я только хотел узнать, запущен ли c:\loc1\test.exe, а не все экземпляры test.exe.
Проверьте, работает ли определенный exe файл
Ответ 1
bool isRunning = Process.GetProcessesByName("test")
.FirstOrDefault(p => p.MainModule.FileName.StartsWith(@"c:\loc1")) != default(Process);
Ответ 2
попробуйте это... Я использую его для определения при запуске, если другой процесс уже запущен с тем же именем, что и exe, который я пытаюсь запустить, а затем просто вывожу его на передний план (и фокусировать), если он уже запущен... Вы можете изменить его, чтобы получить имя процесса и проверить его для определенного имени... Это скажет вам, есть ли процесс, выполняющийся с определенным именем, но не там, где этот процесс был загружен..
Если есть процесс, выполняющийся с указанным именем, тогда, если у этого процесса был открытый доступный метод, который возвращает туда, откуда он был загружен, вы можете вызвать этот метод в текущем процессе, иначе я не знаю..
Но только из любопытства, почему вас это волнует, если они не разные? И если они в некотором роде отличаются, код, чтобы использовать эту разницу (независимо от того, что это), чтобы обнаружить, что загружается. Но если они одинаковы, может ли это повлиять на то, какое изображение на диске было использовано для его загрузки?
[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;
}
Ответ 3
Вы должны перебрать все существующие процессы, а затем проверить их свойство MainModule для имени файла, которое вы ищете. Что-то вроде этого
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...
}
}
Ответ 4
Эта функция может помочь:
using System.Diagnostics;
public bool IsProcessOpen(string name)
{
foreach (Process clsProcess in Process.GetProcesses()) {
if (clsProcess.ProcessName.Contains(name))
{
return true;
}
}
return false;
}
Ответ 5
Это моя улучшенная функция:
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;
}
и используйте его как:
ProgramIsRunning(@"c:\loc1\test.exe");
Ответ 6
Вы можете использовать named mutex, который именован в структуре каталогов, в которой запущена программа.
Ответ 7
System.Reflection.Assembly.GetEntryAssembly()
Это принесет вам много информации о сборке, например:
System.Reflection.Assembly.GetEntryAssembly().CodeBase;
Это укажет местоположение запущенной сборки.