最简单的方法就是使用Process.GetProcessById(pid).ProcessName
,但是这个操作极其耗时,如果获取系统中所有进程的进程名,在我的电脑会耗时3秒多,完全不能接受。
经过反编译发现,上述方法是使用NtQuerySystemInformation
这个来自Ntdll.dll的函数来获取的,同时获取了进程的很多其他信息,操作很耗时。
为了速度,我选择改用Win32的API来获取。获取方式如下:
var process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, processid);
if (process != NULL)
{
var length = (DWORD)MAX_PATH;
var path = new StringBuilder(MAX_PATH);
if (QueryFullProcessImageName(process, 0, path, ref length))
{
return Path.ChangeExtension(Path.GetFileName(path.ToString()), null);
}
CloseHandle(process);
}
主要流程就是,首先通过OpenProcess
函数来获取进程句柄,同时这里我们只需要PROCESS_QUERY_LIMITED_INFORMATION
权限即可,避免对某些进程的操作因为权限问题失败。然后通过QueryFullProcessImageName
即可获取进程可执行文件的完整路径,然后通过C#的Path
的方法,来获取文件名并去掉扩展名即可。最后,不要忘记关闭进程句柄。