使用具有多个窗口的SendKeys

时间:2015-02-10 11:59:26

标签: winforms sendkeys

您可以使用SendKeys向当前活动应用程序上的焦点控件发送击键。 This answer显示了如何将应用程序带到前台,以便将其作为SendKeys的目标。

但这假设有一个窗口。有没有办法将SendKeys与同一应用程序的特定窗口一起使用,甚至以某种方式关闭窗口?

1 个答案:

答案 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方法。