Вызов диспетчера задач Windows с выбранной вкладкой «производительность»

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

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

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


person d.moncada    schedule 08.08.2011    source источник


Ответы (4)


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

Запустите его как консольное приложение. Вам нужно добавить ссылки на 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();
        }
    }
}

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

person Chris Laplante    schedule 08.08.2011
comment
Спасибо за быстрое решение. Зная, что это можно сделать «технически», я немного больше изучу автоматизацию и посмотрю, что я могу сделать. - person d.moncada; 08.08.2011
comment
Рад, что смог помочь. Приведенный выше код должен подойти для использования в производственной среде, если вы добавите некоторую проверку ошибок. До вашего вопроса я вообще-то понятия не имел об этих управляемых аппаратах Автоматики. Так что спасибо, что случайно познакомили меня с ними :) - person Chris Laplante; 08.08.2011
comment
Кроме того, если вы используете мой код, обязательно замените цикл while на... что-нибудь получше. Это имеет возможность зацикливаться навсегда - person Chris Laplante; 08.08.2011

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

person Philipp Schmid    schedule 08.08.2011

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

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

person Frédéric Hamidi    schedule 08.08.2011
comment
+1 - Уродливым хаком было бы изменить последнюю активную вкладку через реестр в HKCU/Software/Microsoft/Windows NT/CurrentVersion/TaskManager - person user703016; 08.08.2011
comment
taskmgr ПОДДЕРЖИВАЕТ аргументы CLI. - person Zimba; 06.04.2020

Начиная с Windows 10, сборка 18305, теперь вы можете установить предпочтительную вкладку, для которой по умолчанию будет открываться диспетчер задач.

Обновить:

  • Нажмите на меню «Пуск» и в поле поиска введите «Центр обновления Windows».
  • Выберите «Настройки Центра обновления Windows».
  • На левой панели нажмите «Предварительные сборки».
  • Нажмите «Проверить» сейчас.
  • Скачайте новую сборку.

После обновления измените значение dword StartUpTab в разделе реестра Win: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\TaskManager

0 – Processes tab
1 – Performance tab
2 – App history tab
3 – Startup tab
4 – Users tab
5 – Details tab
6 – Services tab

Выиграть CMD:
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\TaskManager /v "startup" /t REG_DWORD /d "1"

Эта (экспериментальная) функция доступна только для некоторых участников программы предварительной оценки Windows.

Никакие другие вкладки, кроме «Автозагрузка», не поддерживаются для более старых сборок Win 10:
taskmgr /4 /startup

Для сброса:
reg delete HKCU\Software\Microsoft\Windows\CurrentVersion\TaskManager /v "Preferences" /f

Чтобы подтвердить измененный ключ:
REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit" /v "LastKey" /d "HKCU\Software\Microsoft\Windows\CurrentVersion\TaskManager" /f & regedit

Протестировано в Win 10 CMD

person Zimba    schedule 06.04.2020