Подтвердить что ты не робот

История приложений Windows 8 taskmanager в С#

Я пытаюсь получить доступ к истории приложений с С#. Я хотел бы представить ту же информацию, что и в диспетчере задач, но я не могу найти api/example. Конечно, я использую настольное приложение.

Чтобы указать проблему: я не интересуюсь CPU/RAM. Единственное, что я хотел бы получить, это Time.

UPDATE Чтобы точно показать, о чем я говорю, посмотрите на этот экран: Screen shot

4b9b3361

Ответ 1

Я провел некоторое исследование по этому вопросу, потому что мне показалось интересным, как приложения метро интегрируются в существующую структуру процесса.

Как отметили другие люди, в прекрасном поддерживаемом API-интерфейсе невозможно получить нужную вам информацию. Тем не менее, каждое приложение запускается как другой процесс, а для процессов известны способы получения времени выполнения, времени процессора и т.д.

Если вы найдете соответствующий процесс в своем приложении Windows 8, вы сможете получить необходимую информацию.

Некоторые приложения действительно легко обнаружить. Они просто исполняемые, как и любое другое настольное приложение с надлежащим именем процесса и описанием. Например, на этой картинке "Карта", "Windows Reader" и "Приложение Microsoft Camera":

enter image description here

Некоторые другие приложения немного сложнее обнаружить. Они размещаются в процессе, который запускается wwahost.exe executabe. Я мог только определить имя приложения, посмотрев список модулей. Это приложение Bing:

enter image description here

Чтобы перечислить модули и сопоставленные файлы из процесса, вы можете использовать WinAPI VirtualQueryEx и GetMappedFileName.

Затем вы хотите искать файлы, расположенные в %programfiles%\WindowsApps. Это папка, в которой окна сохраняют все файлы приложений для нее.

Каждое приложение имеет файл .pri. Этот файл содержит бинарные метаданные приложения. Вы можете использовать его, чтобы найти имя приложения из процесса, на котором он находится. В той же папке с .pri файлом есть AppxManifest.xml, в котором вы можете найти всевозможные дополнительные сведения об этом приложении.

Я попытаюсь кратко изложить свое письмо:

  • перечислять процессы с помощью WinAPI и получать всю необходимую информацию (время выполнения, время процессора и т.д.).
  • перечислить отображаемые файлы каждого процесса и искать ressources.pri. Каталог, в котором находится этот файл, содержит имя приложения.
  • в качестве бонуса читайте файл AppxManifest.xml для получения дополнительной информации о приложении. Для чтения этого файла может потребоваться привилегия администратора или дополнительные привилегии.

Ответ 2

Существует никакой поддерживаемый способ получения этой информации. К сожалению.

Ответ 3

В описании вопросов нет подробностей о том, что вы говорите о приложениях Metro. Решение будет эквивалентно Process.TotalProcessorTime, но для приложений Metro.

К сожалению, вы не можете получить эту информацию, потому что, как вы заявили, приложения работают в другом процессе (WWAHost.exe). Дизайн Metro немного похож на телефон - вы не можете напрямую манипулировать системой таким же образом. В Windows Runtime нет прямого "процесса" (см. здесь), что, в свою очередь, означает, что класс Process не имеет смысла для порта...

Ответ 4

Я предполагаю, что The only thing I would like to get is Time. означает время начала и окончания каждого процесса

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

Получение информации о запущенных процессах:

using System;
using System.Diagnostics;

public static class ProcessStart
{
    Process[] runningProcesses;
    var processesStartTimes = new Dictionary<int, Datetime>();
    var processesExitTimes = new Dictionary<int, Datetime>();

    static ProcessStart()
    {
        // This will get current running processes
        runningProcesses = Process.GetProcesses();
        foreach (var p in processes)
        {
            p.Exited += new EventHandler(ProcessExited);
            processesStartTimes.Add(p.Id, p.StartTime);
        }
    }

    private void ProcessExited(object sender, System.EventArgs e)
    {
        var p = (Process)sender;
        processesExitTimes.Add(p.Id, p.ExitTime);
    }
}

Получение новых запущенных процессов

Вам нужно создать новый объект Timer и запустить его каждую секунду для проверки новых созданных процессов. Я скопировал код выше и расширил его:

public static class ProcessStart
{
    Process[] runningProcesses;
    var processesStartTimes = new Dictionary<int, Datetime>();
    var processesExitTimes = new Dictionary<int, Datetime>();
    var updateTimer = new Timer(1000);

    static ProcessStart()
    {
        // This will get current running processes
        runningProcesses = Process.GetProcesses();
        foreach (var p in processes)
        {
            p.Exited += new EventHandler(ProcessExited);
            processesStartTimes.Add(p.Id, p.StartTime);
        }
        updateTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    }

    private void ProcessExited(object sender, System.EventArgs e)
    {
        var p = (Process)sender;
        processesExitTimes.Add(p.Id, p.ExitTime);
    }

    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        runningProcesses = Process.GetProcesses();
        foreach (var p in processes)
        {
            // This will only add the processes that are not added yet
            if (!processesStartTimes.Keys.Contains(p.Id))
            {
                p.Exited += new EventHandler(ProcessExited);
                processesStartTimes.Add(p.Id, p.StartTime);
            }
        }
    }
}

Наконец:

Вам просто нужно сыграть с классом System.Diagnostics.Process. Это должен быть ваш лучший способ получить всю необходимую информацию о процессах Windows. Он предоставит вам доступ к широкому спектру свойств и методов. Вот официальный представитель MSDN:

Класс процесса

EDIT:

Как я вижу из вашего комментария, вас интересует время, затрачиваемое процессором на выполнение определенного процесса. Этот же класс System.Diagnostics.Process содержит эту информацию. Это можно найти с помощью свойства Process.PrivilegedProcessorTime. Описание MSDN для этого свойства:

TimeSpan, который указывает время, в течение которого процесс провел текущий код внутри ядра операционной системы.

Подробнее Здесь

ИЗМЕНИТЬ 2:

Следующие 2 свойства также могут дать вам, вероятно, то, что вам нужно:

Process.UserProcessorTime: Здесь

A TimeSpan, который указывает время, в течение которого связанный процесс провел текущий код внутри части приложения процесса (не внутри ядра операционной системы).

Process.TotalProcessorTime: Здесь

A TimeSpan, указывающий количество времени, затрачиваемого связанным процессом с использованием CPU. Это значение представляет собой сумму UserProcessorTime и PrivilegedProcessorTime.