Для этого вам может быть полезно использовать UI Automation. Я привел несколько примеров кода, который активирует первое окно Firefox с надписью «Переполнение стека» в его заголовке. Очевидно, что вы можете проверить любое другое условие, доступное для API автоматизации. Я выбрал Firefox как образец приложения, потому что он все еще (по версии v35) использует один процесс для всех своих вкладок и окон.
// Get Firefox process.
var ffProcess = Process.GetProcessesByName("firefox").FirstOrDefault();
if (ffProcess != null)
{
// Find all desktop windows belonging to Firefox process.
var ffCondition = new PropertyCondition(AutomationElement.ProcessIdProperty, ffProcess.Id);
var ffWindows = AutomationElement.RootElement.FindAll(TreeScope.Children, ffCondition);
// Identify first Firefox window having "Stack Overflow" in its caption.
var soWindow = ffWindows.Cast<AutomationElement>().FirstOrDefault(w => w.Current.Name.Contains("Stack Overflow"));
if (soWindow != null)
{
// Treat automation element as a window.
var soWindowPattern = soWindow.GetCurrentPattern(WindowPattern.Pattern) as WindowPattern;
if (soWindowPattern != null)
{
// Restore window (activating it).
soWindowPattern.SetWindowVisualState(WindowVisualState.Normal);
// Pause to observe effect. Do not set a breakpoint here.
Thread.Sleep(4000);
// Close window.
soWindowPattern.Close();
}
}
}
Преимущества UI Automation над SendKeys
является то, что он позволяет находить и манипулировать конкретные элементы управления с помощью управляемых API (а не P/Invoke колдовства). Например, чтобы обновить текстовое поле, вы можете использовать метод ValuePattern.SetValue
.
«отдельные окна одного и того же приложения» несколько неоднозначны. Вы имеете в виду несколько процессов одного и того же исполняемого файла или фактически несколько форм (a.k.a. «windows») в том же процессе? –
Тот же процесс, несколько окон. – Gigi