Windows锁定获取访问权限时使用SendKeys

时间:2015-05-13 04:01:28

标签: c# .net winforms webbrowser-control

我有一个带有WebBrowser控件的.NET Winform,它使用用户名和密码登录到网站。 "提交"按钮被禁用,直到在密码文本框中输入了某些内容,因此我无法使用txt.SetAttribute(),因为它似乎没有启用提交按钮。使用SendKeys.Send(密码)工作正常,并启用提交按钮。

问题是当我的计算机锁定时,似乎SendKeys命令会导致以下情况:

System.ComponentModel.Win32Exception (0x80004005): Access is denied
at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)

起初我认为这与我的帐户有关,但我是PC上的管理员,我的会话仍然活着,只是PC被锁定了。

我读了here我可以使用SendMessage API函数,所以我尝试了这个:

System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessesByName(_formProcessName).FirstOrDefault();
if (p == null)
{
    throw new Exception(string.Format("Login Error. Cannot find window process name: [{0}]", _formProcessName));
}
IntPtr h = p.MainWindowHandle;
const int WM_SETTEXT = 0x000C;
SendMessage(h, WM_SETTEXT, IntPtr.Zero, _password);  

......无济于事。没有错误,但它似乎没有向窗口发送任何内容,即使它确实获得了正确的窗口句柄。

我的问题是,即使我的电脑被锁定,我怎样才能对一个web浏览器控件执行SendKeys()?有人有什么建议吗?

1 个答案:

答案 0 :(得分:0)

经过多次挖掘,我决定切换到Selenium。而且它更简单!!

using (var driver = new ChromeDriver())
{
    // Go to the home page
    driver.Navigate().GoToUrl("yourloginpageurl");

    var userNameField = driver.FindElementByName("userIdTextInput");
    userNameField.SendKeys("aaa");

    var passwordField = driver.FindElementByName("pwdIdTextInput");
    passwordField.SendKeys("bbb");

    var loginButton = driver.FindElementByXPath("//form[@id='abc']/button");
    loginButton.Click();

}

就这么简单。 PC锁定时工作正常,所以主要问题就解决了。它也更容易编码。 built-in wait objects比WebBrowser的DocumentWait事件更容易。如果您在使用WebBrowser控件后遇到问题,我建议您尝试使用Selenium。到目前为止,我看到的唯一缺点是它是您正在使用的浏览器的真实实例,因此它没有内置到您的表单中,您可以根据需要隐藏它。