当 Windows 锁被拒绝访问时使用 SendKeys
Using SendKeys when Windows locks gets Access Denied
我有一个带有 WebBrowser 控件的 .NET Winform,它使用用户名和密码登录网站。 "submit" 按钮被禁用,直到在密码文本框中输入内容,所以我不能使用 txt.SetAttribute() 因为它似乎没有启用提交按钮。使用 SendKeys.Send(password) 可以正常工作,并且启用了提交按钮。
问题是当我的计算机锁定时,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的admin,我的session还在,只是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);
...无济于事。没有错误,但它似乎没有向 window 发送任何内容,即使它确实获得了正确的 window 句柄。
我的问题是,即使我的电脑处于锁定状态,我如何才能对网络浏览器控件执行 SendKeys()?有人有什么建议吗?
经过大量挖掘,我决定切换到 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。到目前为止我看到的唯一缺点是它是您正在使用的浏览器的真实实例,因此它没有内置到您可以隐藏它的表单中。
我有一个带有 WebBrowser 控件的 .NET Winform,它使用用户名和密码登录网站。 "submit" 按钮被禁用,直到在密码文本框中输入内容,所以我不能使用 txt.SetAttribute() 因为它似乎没有启用提交按钮。使用 SendKeys.Send(password) 可以正常工作,并且启用了提交按钮。
问题是当我的计算机锁定时,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的admin,我的session还在,只是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);
...无济于事。没有错误,但它似乎没有向 window 发送任何内容,即使它确实获得了正确的 window 句柄。
我的问题是,即使我的电脑处于锁定状态,我如何才能对网络浏览器控件执行 SendKeys()?有人有什么建议吗?
经过大量挖掘,我决定切换到 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。到目前为止我看到的唯一缺点是它是您正在使用的浏览器的真实实例,因此它没有内置到您可以隐藏它的表单中。