Как получить имя активного оконного приложения, как показано в диспетчере задач

Я пытаюсь получить имя активного окна, как показано в списке приложений диспетчера задач (используя С#). У меня была та же проблема, что описана здесь. Я пытался сделать, как они описали, но у меня есть проблема, в то время как сфокусированное приложение является библиотекой изображений, я получаю исключение. Я также пробовал это, но ничто не дает ожидаемых результатов. На данный момент я использую:

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

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

и удалите то, что не имеет отношения к делу, на основе таблицы, которую я создал для наиболее распространенных приложений, но мне не нравится этот обходной путь. Есть ли способ получить имя приложения, как оно есть в диспетчере задач для всех запущенных приложений?


person eskadi    schedule 05.03.2014    source источник
comment
Чего именно вы пытаетесь достичь? Получить заголовок окна для активного окна или список имен запущенных процессов?   -  person Mike Cheel    schedule 05.03.2014
comment
получить заголовок окна для активного окна, но не полное имя, а короткое имя, которое отображается в диспетчере задач.   -  person eskadi    schedule 05.03.2014


Ответы (2)


Много прочитав, я разделил свой код на два случая: для приложения метро и всех остальных приложений. Мое решение обрабатывает исключение, которое я получил для приложений метро, ​​и исключения, которые я получил в отношении платформы. Это код, который, наконец, сработал:

[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;
}
person eskadi    schedule 10.03.2014

Похоже, вам нужно пройти через каждое окно верхнего уровня (прямые дочерние элементы окна рабочего стола, используйте EnumWindows через pinvoke http://msdn.microsoft.com/en-us/library/windows/desktop/ms633497).(v=vs.85).aspx ), а затем вызовите функцию Pinvoke GetWindowText.

EnumWindows будет «перечислять все окна верхнего уровня на экране, передавая дескриптор каждого окна, в свою очередь, функции обратного вызова, определяемой приложением».

person Mike Cheel    schedule 05.03.2014
comment
в отправляемой вами ссылке говорится: Примечание. Для Windows 8 и более поздних версий EnumWindows перечисляет только окна верхнего уровня настольных приложений. Я работаю в win8, и мне нужны также имена приложений для метро. - person eskadi; 06.03.2014
comment
Возможно, вы сможете использовать GetWindow, но я не работал с метро-приложениями, поэтому не могу сказать наверняка. - person Mike Cheel; 06.03.2014