您可以使用SendKeys向当前活动应用程序上的焦点控件发送击键。 This answer显示了如何将应用程序带到前台,以便将其作为SendKeys的目标。
但这假设有一个窗口。有没有办法将SendKeys与同一应用程序的特定窗口一起使用,甚至以某种方式关闭窗口?
答案 0 :(得分:1)
您可能最好使用UI Automation。我在下面提供了一些示例代码,它激活了第一个Firefox窗口,其标题中包含“Stack Overflow”。显然,您可以测试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();
}
}
}
UI自动化优于SendKeys
的一个优点是,它允许您使用托管API(而不是P / Invoke魔法)查找和操作特定控件。例如,要更新文本框,您可以使用ValuePattern.SetValue
方法。