从进程ID或句柄获取进程名称

15
假设我已经有一个窗口的句柄,我可以使用 GetWindowThreadProcessId 获取该进程的PID。有没有一种方法可以在不获取所有进程并尝试匹配我的PID的情况下获取进程名称?
3个回答

20
您可以使用 Process.GetProcessById 方法获取 Process 进程对象。这个对象包含了关于正在运行的程序的大量信息。通过 Process.ProcessName 可以得到进程名称,通过 Process.MainModule.FileName 可以得到可执行文件的名称。

是的,你说得对。谢谢。我还可以获取有关该过程的其他信息。 - user579674
3
请注意,当在一个 x86 程序中调用时,Process.MainModule.Filename 在针对64位目标时会失败。但是 ProcessName 不会受到这个限制。 - EricLaw
@EricLaw 你知道相反的情况是否成立吗?比如在x86目标上使用64位程序调用Process.MainModule.Filename时会发生什么? - Freesnöw

14
string name;
using (var p = Process.GetProcessById(id)) { name = p.ProcessName; }

进程对象是可处理的。您需要处理该进程。 - CamHart
你是对的,我更新了我的回答 :) - A.Baudouin

0

// 这是一个很棒的小方法来返回任务管理器内存。如果进程 ID 不存在,它将会抛出异常并返回内存为 0

    /// <summary>
    /// Gets the process memory.
    /// </summary>
    /// <param name="processId">The process identifier.</param>
    /// <returns></returns>
    /// <para> </para>
    /// <para> </para>
    /// <exception cref="ArgumentException"> </exception>
    /// <exception cref="ArgumentNullException"> </exception>
    /// <exception cref="ComponentModel.Win32Exception"> </exception>
    /// <exception cref="InvalidOperationException"> </exception>
    /// <exception cref="PlatformNotSupportedException"> </exception>
    /// <exception cref="UnauthorizedAccessException"> </exception>
    public static long GetProcessMemory(int processId)
    {
        try
        {
            var instanceName = Process.GetProcessById(processId).ProcessName;

            using (var performanceCounter = new PerformanceCounter("Process", "Working Set - Private", instanceName))
            {
                return performanceCounter.RawValue / Convert.ToInt64(1024);
            }
        }
        catch (Exception)
        {
            return 0;
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接