1

作为练习,我正在尝试使用 FlaUI 自动键入 RDP 凭据。我的操作系统是 Windows 10。

我可以启动 mstsc.exe 并在此窗口中输入:

mstsc 窗口

但是后来我得到了这个窗口,但我在任何地方都找不到它:

凭据管理器 UI 主机窗口

它不是 mstsc 窗口,即使它作为模式窗口出现在其上方: mstsc 始终只有一个窗口。显然,它是“凭据管理器 UI 主机”的窗口,但该过程具有......零窗口。

即使在任务管理器中,它也列在后台任务中,而不是在应用程序部分中。FlaUI Inspect 根本看不到它。

顺便说一句,这是我的代码:

var CurrentAutomation = new UIA3Automation();
var Process = Application.Attach(Process.GetProcessesByName("CredentialUIBroker")[0]);
var Windows = Process.GetAllTopLevelWindows(CurrentAutomation); // 0 elements

如何使用 FlaUI 获取此窗口的句柄并访问其文本框?

4

1 回答 1

3

事实证明,这只是知道“窗口”名称的问题,即 Credential Dialog Xaml Host;此外,可以使用 FlaUI Inspect 找到它。

一旦 mstsc 部分完成并出现“Windows 安全”窗口,您可以继续使用此示例代码:

// Declare all variables, which might be method parameters instead
var Password = "MyLamePassword";
var MaxTimeout = new TimeSpan(10 * 1000 * 2000);
var CurrentAutomation = new UIA3Automation();
var Desktop = CurrentAutomation.GetDesktop();

// Get the window, using a Retry call to wait for it to be available
var CredentialWindow = Retry
    .WhileEmpty(
        () => Desktop.FindAllDescendants(f => f.ByClassName("Credential Dialog Xaml Host")),
        timeout: MaxTimeout,
        throwOnTimeout: true)
    .Result[0];

// Get the password box
AutomationElement PasswordBox = null;
Retry.WhileNull(
    () => PasswordBox = CredentialWindow.FindFirstDescendant(f => f.ByName("Password").And(f.ByControlType(ControlType.Edit))),
    timeout: MaxTimeout,
    throwOnTimeout: true);

// Type the password
PasswordBox.FocusNative();
Keyboard.Type(Password);

// I have some Retry code here too, just to check that the password is actually typed, and type Enter after it. 

CurrentAutomation.Dispose();
于 2020-04-02T16:36:22.713 回答