Чтобы подробнее остановиться на посте Филиппа Шмида, я сделал небольшую демонстрацию:
Запустите его как консольное приложение.Вам нужно добавить ссылки на 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();
}
}
}
Почему я уничтожаю предыдущие экземпляры диспетчера задач?Когда экземпляр уже открыт, дополнительные экземпляры будут открыты, но немедленно закрыты.Мой код не проверяет это, поэтому код, который находит дескриптор окна, зависнет.