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
bool isRunning = Process.GetProcessesByName("test")
.FirstOrDefault(p => p.MainModule.FileName.StartsWith(@"c:\loc1")) != default(Process);
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;
}
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.
Se puede usar un named mutex, que llama así fuera de la estructura de directorios del programa se está ejecutando en
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;
}
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...
}
}
genio! ¡te amo! – Nahum
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). –
É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");
¿Dónde está Break? ¿Por qué querríamos recorrer todos los artículos si nuestro proceso puede ser primero desde 300? – Tommix
¡oh! tienes razón. corregido –
- 1. Comprueba si UIWebView está cargado
- 2. Comprueba si un BSTR está vacío
- 3. Comprobar si el proceso se está ejecutando
- 4. Si se comprueba nulo
- 5. Dentro de un archivo por lotes, ¿cómo puedo saber si se está ejecutando un proceso?
- 6. Ejecutando .exe desde Javascript
- 7. Verifica programáticamente si se está ejecutando syncdb
- 8. comisión si ya se está ejecutando
- 9. Windows BAT: prueba si un archivo específico está vacío
- 10. cómo se comprueba si UIWebView está vacío o no
- 11. Comprueba si un elemento DOM dado está listo
- 12. ¿Cómo puede saber mi programa si Delphi se está ejecutando?
- 13. Comprobando si mi aplicación de Windows se está ejecutando
- 14. Rails js.erb archivo no se está ejecutando
- 15. ¿Cómo comprobar si un servicio se está ejecutando a través de un archivo por lotes e iniciarlo, si no se está ejecutando?
- 16. ¿Cómo puedo verificar si un programa se está ejecutando por primera vez?
- 17. Cómo comprobar si se está ejecutando un Thread de Android
- 18. Compruebe si un script php todavía se está ejecutando
- 19. ¿Cómo verificar si un proceso se está ejecutando con Delphi?
- 20. ¿Cómo saber si se está ejecutando un temporizador?
- 21. ¿Verifica si se está ejecutando un servicio de Windows?
- 22. encontrar un trabajo si se está ejecutando en Quartz1.6
- 23. ¿Cómo puedo saber si un proceso se está ejecutando?
- 24. Powershell: si un proceso no se está ejecutando, inícielo
- 25. ¿Comprueba si IIS está instalado o no?
- 26. ¿Cómo puedo detectar si se está ejecutando el Delphi IDE específico?
- 27. Comprueba si html 5 shim está cargado
- 28. Comprueba si el atributo CoreData está vacío
- 29. Comprueba si el intento uri está disponible
- 30. VB Comprueba si int está vacío
gracias, esto es exactamente lo que estoy buscando. – murasaki5
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())'. –
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