0
您可以使用SendKeys將擊鍵發送到當前活動應用程序的聚焦控件。 This answer展示瞭如何將應用程序引入前臺,以使其成爲SendKeys的目標。在多個窗口中使用SendKeys
但是,這假設有一個窗口。有什麼辦法可以將SendKeys與同一個應用程序的特定窗口一起使用,或者甚至以某種方式關閉窗口?
您可以使用SendKeys將擊鍵發送到當前活動應用程序的聚焦控件。 This answer展示瞭如何將應用程序引入前臺,以使其成爲SendKeys的目標。在多個窗口中使用SendKeys
但是,這假設有一個窗口。有什麼辦法可以將SendKeys與同一個應用程序的特定窗口一起使用,或者甚至以某種方式關閉窗口?
爲此,您最好使用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
方法。 「
」同一應用程序的特定窗口「有點含糊不清。你的意思是同一個可執行程序的多個進程,或者實際上是多個進程在同一進程中的多個進程(又名「windows」)? – 2015-02-10 12:02:08
同一個進程,多個窗口。 – Gigi 2015-02-10 12:59:44