Вызов диспетчера задач Windows с выбранной вкладкой «Производительность» - PullRequest
7 голосов
/ 08 августа 2011

В настоящее время я вызываю диспетчер задач Windows, используя событие click в WPF. Событие просто выполняет Process.Start («taskmgr»).

У меня вопрос, есть ли способ выбрать, какая вкладка внутри диспетчера задач выбирается при запуске / отображении процесса? Я хочу, чтобы вкладка «Производительность» выбиралась автоматически при каждом событии клика.

Спасибо за помощь.

Ответы [ 3 ]

6 голосов
/ 08 августа 2011

Чтобы подробнее остановиться на посте Филиппа Шмида, я сделал небольшую демонстрацию:

Запустите его как консольное приложение.Вам нужно добавить ссылки на UIAutomationClient и UIAutomationTypes.

Одно из возможных улучшений, которое вы (или я, если хотите) можете сделать, - это сначала скрыть окно, показывая его только после правильногоВкладка была выбрана.Однако я не уверен, что это сработает, поскольку я не уверен, что AutomationElement.FromHandle сможет найти скрытое окно.

Редактировать: По крайней мерена моем компьютере (Windows 7, 32-разрядная версия, .Net Framework 4.0) следующий код изначально создает скрытый диспетчер задач и показывает его после выбора правильной вкладки.Я не отображаю окно в явном виде после выбора вкладки производительности, поэтому, вероятно, одна из линий автоматизации приводит к побочным эффектам.

using System;
using System.Diagnostics;
using System.Windows.Automation;

namespace ConsoleApplication2 {
    class Program {
        static void Main(string[] args) {
            // Kill existing instances
            foreach (Process pOld in Process.GetProcessesByName("taskmgr")) {
                pOld.Kill();
            }

            // Create a new instance
            Process p = new Process();
            p.StartInfo.FileName = "taskmgr";
            p.StartInfo.CreateNoWindow = true;
            p.Start();

            Console.WriteLine("Waiting for handle...");

            while (p.MainWindowHandle == IntPtr.Zero) ;

            AutomationElement aeDesktop = AutomationElement.RootElement;
            AutomationElement aeForm = AutomationElement.FromHandle(p.MainWindowHandle);
            Console.WriteLine("Got handle");

            // Get the tabs control
            AutomationElement aeTabs = aeForm.FindFirst(TreeScope.Children,
  new PropertyCondition(AutomationElement.ControlTypeProperty,
    ControlType.Tab));

            // Get a collection of tab pages
            AutomationElementCollection aeTabItems = aeTabs.FindAll(TreeScope.Descendants, new PropertyCondition(AutomationElement.ControlTypeProperty,
    ControlType.TabItem));

            // Set focus to the performance tab
            AutomationElement aePerformanceTab = aeTabItems[3];
            aePerformanceTab.SetFocus();
        }
    }
}

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

2 голосов
/ 08 августа 2011

Хотя у taskmgr.exe нет аргументов командной строки для указания выбранной вкладки, вы можете использовать Windows UI Automation , чтобы «перейти» на вкладку производительности.

1 голос
/ 08 августа 2011

К сожалению, taskmgr.exe не поддерживает ни один аргумент командной строки.

При запуске всегда активируется вкладка, которая была активна при последнем закрытии.

...