【问题标题】: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;
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2014-10-02
      • 2011-03-19
      • 1970-01-01
      相关资源
      最近更新 更多