模拟非活动webrowser控件上的实际击键

时间:2016-01-15 21:05:06

标签: c# angularjs winforms webbrowser-control keystroke

我有一个C#winforms应用程序,其中嵌入了WebBrowser控件以实现网站自动化。我需要从应用程序内部以编程方式发送键盘笔划到嵌入式WebBrowser控件,即使应用程序隐藏或未聚焦。将文本设置为HTML文本框通常可以正常工作,但有时不会(因为带有AngularJS验证的HTML表单会忽略它,因为我认为它不是真正的打字)。

我花了两周的时间搜索并尝试了不同的方法:

  • SendInput或SendKeys:仅在应用程序被预先考虑(不好)时才能正常工作。

  • 提升OnKeyDown和OnKeyPress事件:在表单级别和WebBrowser控件级别不能为我工作。

  • 在DOM中使用JQuery提升keydown,keypress,keyup事件:没有成功。

对此有任何解决方案吗? 感谢

1 个答案:

答案 0 :(得分:0)

经过大量的试验和错误后找到了解决方案。 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;
}