2015-02-10 7 views
0

Вы можете использовать SendKeys для отправки нажатий клавиш на сфокусированное управление в текущем активном приложении. This answer показывает, как перенести приложение на передний план, чтобы он мог стать объектом SendKeys.Использование SendKeys с несколькими окнами

Но это предполагает, что существует одно окно. Можно ли использовать SendKeys с конкретными окнами одного и того же приложения или даже с закрытыми окнами?

+0

«отдельные окна одного и того же приложения» несколько неоднозначны. Вы имеете в виду несколько процессов одного и того же исполняемого файла или фактически несколько форм (a.k.a. «windows») в том же процессе? –

+0

Тот же процесс, несколько окон. – Gigi

ответ

1

Для этого вам может быть полезно использовать 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.

Смежные вопросы