我想知道如果程序正在运行,我可以检查特定位置的程序。例如,c:\ loc1 \ test.exe和c:\ loc2 \ test.exe中的test.exe有两个位置。我只想知道c:\ loc1 \ test.exe是否正在运行,而不是所有的test.exe实例。
答案 0 :(得分:51)
bool isRunning = Process.GetProcessesByName("test")
.FirstOrDefault(p => p.MainModule.FileName.StartsWith(@"c:\loc1")) != default(Process);
答案 1 :(得分:6)
这是我改进的功能:
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");
答案 2 :(得分:5)
尝试这个......我用它来确定启动时是否已经运行了另一个进程,其名称与我正在尝试启动的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 :(得分:4)
您应该遍历所有现有进程,然后检查其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 :(得分:3)
此功能可能有所帮助:
using System.Diagnostics;
public bool IsProcessOpen(string name)
{
foreach (Process clsProcess in Process.GetProcesses()) {
if (clsProcess.ProcessName.Contains(name))
{
return true;
}
}
return false;
}
答案 5 :(得分:0)
您可以使用named mutex,它以运行程序的目录结构命名。
答案 6 :(得分:0)
类似这样的事情。 GetMainModuleFileName帮助从x86访问x64进程。
[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;
}
答案 7 :(得分:-1)
System.Reflection.Assembly.GetEntryAssembly()
这将为您带来关于条目汇编的大量信息,例如:
System.Reflection.Assembly.GetEntryAssembly().CodeBase;
这将告诉正在运行的程序集的位置。