Чтобы расширить пост Филиппа Шмида, я сделал небольшую демонстрацию:
Запустите его как консольное приложение. Вам нужно добавить ссылки на 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