2011-08-08 11 views
6

Actualmente estoy invocando el administrador de tareas de Windows usando un evento de clic en WPF. El evento simplemente ejecuta 'Process.Start ("taskmgr").Invocar el administrador de tareas de Windows con la pestaña 'rendimiento' seleccionada

Mi pregunta es, ¿hay alguna manera de elegir qué pestaña dentro del administrador de tareas se selecciona cuando se inicia/se muestra el proceso? Estoy buscando que la pestaña "rendimiento" se seleccione automáticamente cada vez que se haga clic en el evento.

Gracias por la ayuda.

Respuesta

5

Para ampliar en el poste de Philipp Schmid, he prepararon rápidamente una pequeña demostración:

ejecutarlo como una aplicación de consola. Necesita agregar referencias a UIAutomationClient y UIAutomationTypes.

Una posible mejora que usted (o yo, si lo desea) puede hacer es ocultar la ventana inicialmente, solo mostrarla después de que se haya seleccionado la pestaña correcta. No estoy seguro si eso funcionaría, sin embargo, ya que no estoy seguro de que AutomationElement.FromHandle pueda encontrar una ventana oculta.

Editar: Al menos en mi equipo (Windows 7, 32 bits, .NET Framework 4.0), el código siguiente crea inicialmente un Administrador de tareas oculta y muestra que después de la ficha correcta ha sido seleccionada. No muestro explícitamente la ventana después de seleccionar la pestaña de rendimiento, por lo que probablemente una de las líneas de automatización tenga un efecto secundario.

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

¿Por qué destruyo instancias anteriores de Administrador de tareas? Cuando una instancia ya está abierta, las instancias secundarias se abrirán pero se cerrarán inmediatamente. Mi código no comprueba esto, por lo que el código que encuentra el identificador de ventana se congelará.

+0

Gracias por la solución rápida. Sabiendo que esto 'técnicamente' se puede hacer, analizaré un poco más la Automatización y veré qué puedo hacer. –

+0

Me alegro de poder ayudar. El código anterior debe ser adecuado para el uso de producción, siempre que agregue alguna comprobación de errores. Antes de su pregunta, en realidad no tenía idea de estos aparatos de automatización gestionados. Entonces, gracias por presentarme accidentalmente :) –

+0

Además, si usas mi código, asegúrate de reemplazar el ciclo while con ... algo mejor. Eso tiene la posibilidad de iterar por siempre –

1

Desafortunadamente, taskmgr.exe no admite ningún argumento de línea de comando.

Cuando se ejecuta, siempre activará la pestaña que estaba activa el último cierre.

+6

+1 - Un hack feo sería cambiar la última pestaña activa a través del registro en 'HKCU/Software/Microsoft/Windows NT/CurrentVersion/TaskManager' –

2

Aunque taskmgr.exe no tiene ningún argumento de línea de comandos para especificar la pestaña seleccionada, puede usar Windows UI Automation para 'navegar' a la pestaña de rendimiento.

Cuestiones relacionadas