2015-02-10 55 views
0

您可以使用SendKeys將擊鍵發送到當前活動應用程序的聚焦控件。 This answer展示瞭如何將應用程序引入前臺,以使其成爲SendKeys的目標。在多個窗口中使用SendKeys

但是,這假設有一個窗口。有什麼辦法可以將SendKeys與同一個應用程序的特定窗口一起使用,或者甚至以某種方式關閉窗口?

+0

」同一應用程序的特定窗口「有點含糊不清。你的意思是同一個可執行程序的多個進程,或者實際上是多個進程在同一進程中的多個進程(又名「windows」)? – 2015-02-10 12:02:08

+0

同一個進程,多個窗口。 – Gigi 2015-02-10 12:59:44

回答

1

爲此,您最好使用UI Automation。我在下面提供了一些示例代碼,它激活了第一個在其標題中具有「堆棧溢出」的Firefox窗口。您顯然可以測試Automation 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(); 
     } 
    } 
} 

超過SendKeys UI自動化的一個優點是,它可以讓你找到和操作使用管理API的具體控制(而不是P /調用巫術)。例如,要更新文本框,可以使用ValuePattern.SetValue方法。 「