C#根据PID获取进程名

最简单的方法就是使用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的方法,来获取文件名并去掉扩展名即可。最后,不要忘记关闭进程句柄。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据