如何获取任务管理器中显示的活动窗口应用程序名称

Posted

技术标签:

【中文标题】如何获取任务管理器中显示的活动窗口应用程序名称【英文标题】:How to get active window app name as shown in task manager 【发布时间】:2021-04-03 18:44:02 【问题描述】:

我正在尝试获取活动窗口的名称,如任务管理器应用程序列表中所示(使用 c#)。 我遇到了与here 描述的相同的问题。 我尝试按照他们的描述进行操作,但是当重点应用程序是我遇到异常的图片库时,我遇到了问题。 我也试过this,但没有给我预期的结果。 现在我使用:

IntPtr handle = IntPtr.Zero;
handle = GetForegroundWindow();

const int nChars = 256;
StringBuilder Buff = new StringBuilder(nChars);
if (GetWindowText(handle, Buff, nChars) > 0)

    windowText = Buff.ToString();

并根据我为大多数常见应用程序创建的表删除不相关的内容,但我不喜欢这种解决方法。 有没有办法在任务管理器中为所有正在运行的应用获取应用名称?

【问题讨论】:

你到底想完成什么?获取活动窗口的窗口标题或正在运行的进程名称列表? 获取活动窗口的窗口标题,但不是全名,而是任务管理器中显示的短名称。 【参考方案1】:

在阅读了很多之后,我将我的代码分为两种情况,用于 Metro 应用程序和所有其他应用程序。 我的解决方案处理我遇到的 Metro 应用程序异常和我遇到的有关平台的异常。 这是最终起作用的代码:

[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

public string GetActiveWindowTitle()

    var handle = GetForegroundWindow();
    string fileName = "";
    string name = "";
    uint pid = 0;
    GetWindowThreadProcessId(handle, out pid);

    Process p = Process.GetProcessById((int)pid);
    var processname = p.ProcessName;

    switch (processname)
    
        case "explorer": //metro processes
        case "WWAHost":
            name = GetTitle(handle);
            return name;
        default:
            break;
    
    string wmiQuery = string.Format("SELECT ProcessId, ExecutablePath FROM Win32_Process WHERE ProcessId LIKE '0'", pid.ToString());
    var pro = new ManagementObjectSearcher(wmiQuery).Get().Cast<ManagementObject>().FirstOrDefault();
    fileName = (string)pro["ExecutablePath"];
    // Get the file version
    FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(fileName);
    // Get the file description
    name = myFileVersionInfo.FileDescription;
    if (name == "")
        name = GetTitle(handle);

 return name;


public string GetTitle(IntPtr handle)

string windowText = "";
    const int nChars = 256;
    StringBuilder Buff = new StringBuilder(nChars);
    if (GetWindowText(handle, Buff, nChars) > 0)
    
        windowText = Buff.ToString();
    
    return windowText;

【讨论】:

【参考方案2】:

听起来您需要遍历每个***窗口(桌面窗口的直接子窗口,通过 pinvoke http://msdn.microsoft.com/en-us/library/windows/desktop/ms633497(v=vs.85).aspx 使用 EnumWindows),然后调用 GetWindowText pinvoke 函数。

EnumWindows 将“枚举屏幕上的所有***窗口,方法是将每个窗口的句柄依次传递给应用程序定义的回调函数。”

【讨论】:

在您发送的链接中说:注意对于 Windows 8 及更高版本,EnumWindows 仅枚举桌面应用程序的***窗口。我在 win8 下工作,还需要 Metro 应用程序名称。 您也许可以使用 GetWindow,但我没有使用 Metro 应用程序,所以不能确定。

以上是关于如何获取任务管理器中显示的活动窗口应用程序名称的主要内容,如果未能解决你的问题,请参考以下文章

获取 window任务栏已经打开应用程序窗口(也就是任务管理器中前台进程)的图标

如何在任务管理器中使用不同的进程名称(对于当前进程)名称?

如何像 Windows 任务管理器中显示的那样获得可用的物理内存

在Windows任务管理器中隐藏应用程序的名称[重复]

如何在winXP中的任务管理器中隐藏程序?

如何获取正在运行的进程的进程ID,如任务管理器中所示