【问题标题】:Simulating real key strokes on an inactive webrowser control在非活动的网络浏览器控件上模拟真实的击键
【发布时间】:2016-01-15 21:05:05
【问题描述】:
我有一个 C# winforms 应用程序,其中嵌入了用于网站自动化的 WebBrowser 控件。我需要以编程方式将键盘敲击从应用程序内发送到嵌入式 WebBrowser 控件即使应用程序被隐藏或未聚焦。将文本设置为 HTML 文本框通常有效,但有时无效(即具有 AngularJS 验证的 HTML 表单会忽略它,因为我认为它不是真正的输入)。
我花了 2 周时间搜索和尝试不同的方法:
SendInput 或 SendKeys:只有在应用程序处于前台时才能正常工作(不好)。
引发 OnKeyDown 和 OnKeyPress 事件:在表单级别和 WebBrowser 控件级别对我不起作用。
在 DOM 中使用 JQuery 引发 keydown、keypress、keyup 事件:没有成功。
有什么解决办法吗?
谢谢
【问题讨论】:
标签:
c#
angularjs
winforms
webbrowser-control
keystroke
【解决方案1】:
经过大量的尝试和错误找到了解决方案。 AngularJS 表单验证机制等待“更改”事件发生(而不是 keydown、keyup、keypress)。触发这个事件并不容易(JQuery.trigger 没有完成这项工作)。我在 WebBrowser 控件中注入了以下函数,然后调用它。
setInputText = function (id, str, x) {
var el = $('#' + id);
if (typeof x === "undefined") {
x = 0;
el.focus();
}
if (x >= str.length) {
el.blur();
return;
}
var c = str.charAt(x);
el.val(el.val() + c);
//This is the magic: trigger change event in pure JS
var evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
el[0].dispatchEvent(evt);
//type each character every 75ms
setTimeout(function () { setInputText(id, str, ++x); }, 75);
return;
}