C# 使用'调用windows任务管理器;性能';所选选项卡

C# 使用'调用windows任务管理器;性能';所选选项卡,c#,wpf,process,taskmanager,C#,Wpf,Process,Taskmanager,我目前正在使用WPF中的单击事件调用windows任务管理器。事件只执行“Process.Start”(“taskmgr”) 我的问题是,是否有一种方法可以选择在流程启动/显示时选择task manager中的哪个选项卡?我希望在每次引发单击事件时自动选择“性能”选项卡 感谢您的帮助。不幸的是,taskmgr.exe不支持任何命令行参数 运行时,它将始终激活上次关闭时处于活动状态的选项卡。虽然taskmgr.exe没有任何命令行参数来指定所选选项卡,但您可以使用“导航”到性能选项卡。要在Phil

我目前正在使用WPF中的单击事件调用windows任务管理器。事件只执行“Process.Start”(“taskmgr”)

我的问题是,是否有一种方法可以选择在流程启动/显示时选择task manager中的哪个选项卡?我希望在每次引发单击事件时自动选择“性能”选项卡


感谢您的帮助。

不幸的是,
taskmgr.exe
不支持任何命令行参数


运行时,它将始终激活上次关闭时处于活动状态的选项卡。

虽然taskmgr.exe没有任何命令行参数来指定所选选项卡,但您可以使用“导航”到性能选项卡。

要在Philipp Schmid的帖子上展开,我制作了一个小演示:

将其作为控制台应用程序运行。您需要添加对
UIAutomationClient
UIAutomationTypes
的引用

您(或者我,如果您愿意的话)可以做的一个可能的改进是最初隐藏窗口,仅在选择了正确的选项卡之后才显示它。但是,我不确定这是否有效,因为我不确定
AutomationElement.FromHandle
是否能够找到隐藏的窗口

编辑:至少在我的计算机(Windows 7,32位.Net framework 4.0)上,以下代码最初创建一个隐藏的任务管理器,并在选择正确的选项卡后显示它。在选择performance选项卡后,我不会显式显示窗口,因此可能会有一条自动化行作为副作用显示

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();
        }
    }
}

为什么要销毁以前的Task Manager实例?当实例已打开时,辅助实例将打开但立即关闭。我的代码没有对此进行检查,因此查找窗口句柄的代码将冻结。

从Windows 10 build 18305开始,您现在可以设置首选选项卡,使任务管理器在默认情况下打开

要更新:

  • 单击“开始”菜单,在搜索框中键入“Windows Update”
  • 选择“Windows更新设置”
  • 在左侧面板中,单击“预览生成”
  • 现在点击“检查”
  • 下载新版本
更新后,更改Win注册表项中
StartUpTab
的dword值:
HKEY\U CURRENT\U 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
Win CMD:
reg添加HKCU\Software\Microsoft\Windows\CurrentVersion\TaskManager/v“startup”/t reg\u DWORD/d“1”

此(实验性)功能仅对某些Windows内部人员可用

Win 10的旧版本不支持除“启动”之外的其他选项卡:
taskmgr/4/启动

要重置:
reg删除HKCU\Software\Microsoft\Windows\CurrentVersion\TaskManager/v“首选项”/f

要确认修改的密钥:
REG添加“HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit”/v“LastKey”/d“HKCU\Software\Microsoft\Windows\CurrentVersion\TaskManager”/f&Regedit


在Win 10 CMD中测试-一个难看的破解方法是通过
HKCU/Software/Microsoft/Windows NT/CurrentVersion/TaskManager
taskmgr中的注册表更改最后一个活动选项卡。taskmgr确实支持CLI参数。感谢您提供的快速解决方案。知道这在技术上是可以做到的,我会更深入地研究自动化,看看我能做些什么。很高兴我能帮上忙。上面的代码应该适合生产使用,只要添加一些错误检查。在你提出问题之前,我实际上对这些管理自动化设备一无所知。所以,谢谢你不小心把我介绍给他们:)另外,如果你使用我的代码,一定要用。。。更好的。这有可能永远循环