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

时间:2014-03-05 15:17:19

标签: c# winapi hwnd active-window

我正在尝试获取活动窗口的名称,如任务管理器应用程序列表中所示(使用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();
}

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

2 个答案:

答案 0 :(得分:4)

在阅读了很多内容后,我将代码分为两种情况,分别用于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;
}

答案 1 :(得分:0)

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

EnumWindows将'通过将句柄依次传递给应用程序定义的回调函数来枚举屏幕上的所有顶级窗口。'