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á.
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. –
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 :) –
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 –