C# 检查特定的exe文件是否正在运行
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1742787/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Check if a specific exe file is running
提问by murasaki5
I want to know how i can check a program in a specific location if it is running. For example there are two locations for test.exe in c:\loc1\test.exe and c:\loc2\test.exe. I only wanted to know if c:\loc1\test.exe is running and not all instances of test.exe.
我想知道如何检查特定位置的程序是否正在运行。例如,test.exe 在 c:\loc1\test.exe 和 c:\loc2\test.exe 中有两个位置。我只想知道 c:\loc1\test.exe 是否正在运行,而不是 test.exe 的所有实例。
采纳答案by bruno conde
bool isRunning = Process.GetProcessesByName("test")
.FirstOrDefault(p => p.MainModule.FileName.StartsWith(@"c:\loc1")) != default(Process);
回答by Charles Bretana
try this... I use it to determine at startup if another process is already running with the same name as the exe I'm trying to start, and then just bring that one to foreground, (and to focus) if it is already running... You could modify it to take a process name and test for that specific name... This will tell you if there is a process running with a certain name, but not where that process was loaded from ...
试试这个...我在启动时用它来确定另一个进程是否已经在运行,其名称与我试图启动的 exe 同名,然后将该进程带到前台,(并聚焦)如果它已经存在正在运行...您可以修改它以获取进程名称并测试该特定名称...这将告诉您是否有一个以特定名称运行的进程,但不会告诉您该进程是从哪里加载的...
If there is a process running with the specified name, then if that process had an exposed accessible method that returns where it was loaded from, you could call that method on the running process, otherwise, I don't know..
如果有一个以指定名称运行的进程,那么如果该进程有一个公开的可访问方法返回它的加载位置,您可以在正在运行的进程上调用该方法,否则,我不知道..
But just out of curiosity, why do you care, unless they're different? And if they're different in some way, code to use that difference (whatever it is) to detect which is loaded. But if they're the same how can it matter which on-disk image was used to load it?
但只是出于好奇,你为什么要关心,除非它们是不同的?如果它们在某些方面不同,则使用该差异(无论是什么)来检测加载的代码。但是,如果它们相同,那么使用哪个磁盘映像加载它又有什么关系呢?
[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;
}
回答by jonaspp
System.Reflection.Assembly.GetEntryAssembly()
This will bring for you a lot of info about the entry assembly, such as:
这将为您带来很多有关入口程序集的信息,例如:
System.Reflection.Assembly.GetEntryAssembly().CodeBase;
This will tell the location of the running assembly.
这将告诉正在运行的程序集的位置。
回答by JustLoren
You could use a named mutex, that's named off of the directory structure the program is running in.
您可以使用命名的互斥锁,它以程序运行的目录结构命名。
回答by Alex Musayev
This function may help:
此功能可能有助于:
using System.Diagnostics;
public bool IsProcessOpen(string name)
{
foreach (Process clsProcess in Process.GetProcesses()) {
if (clsProcess.ProcessName.Contains(name))
{
return true;
}
}
return false;
}
回答by Frank Bollack
You should iterate over all existing processes and then check their MainModule property for the file name you are looking for. Something like this
您应该遍历所有现有进程,然后检查它们的 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...
}
}
回答by Pishgaman.org
This is my improved function :
这是我改进的功能:
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;
}
and use it as :
并将其用作:
ProgramIsRunning(@"c:\loc1\test.exe");
回答by vik_78
Something like this. GetMainModuleFileName helps to access x64 process from x86.
像这样的东西。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;
}