1

WordCaptureX および WebBrowser コンポーネントを使用するアプリケーションを開発しています。

アプリケーションはホットキーを処理し、画面から単語をキャプチャし、WebBrowser コントロールを特定の URL に移動します。ユーザーがアプリケーション WebBrowser から単語をキャプチャできることを期待していますが、いくつかのキャプチャ操作の後、コントロールが読み込み状態でハングし、ナビゲーション メソッドが機能しません。WebBrowser を停止し、破棄して再作成しようとしましたが、何も役に立ちません。

主なアプリケーション操作でデモを作成します。

public partial class Form1 : Form
{
    private readonly WMonitorX _wMonitor = ComFactory.Instance.NewWMonitorX();
    private readonly WCaptureX _wCapture = ComFactory.Instance.NewWCaptureX();

    private readonly ManualResetEvent _runCaptureEvent = new ManualResetEvent(true);
    private readonly ManualResetEvent _startRetrieveEvent = new ManualResetEvent(false);

    private int _hwnd;
    private int _x;
    private int _y;

    private delegate void Worker();
    private readonly Worker _worker;

    public Form1()
    {
        InitializeComponent();

        _wMonitor.LineColor = 11119017;
        _wMonitor.LineWidth = 10;
        _wMonitor.WEvent += _wMonitor_WEvent;
        _wMonitor.Start((int)W_KEY.wmKeyCtrl, (int)W_MOUSE.wmMouseRight, false);

        webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;

        _worker = RunCaptureAndNavigate;
        _worker.BeginInvoke(null, null);
    }

    private void _wMonitor_WEvent(int hwnd, int x1, int y1, int x2, int y2)
    {
        _hwnd = hwnd;
        _x = x1;
        _y = y1;

        _startRetrieveEvent.Set();
    }

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        if (e.Url == webBrowser1.Url)
        {
            _runCaptureEvent.Set();
            toolStripStatusLabel1.Text = "Page loaded";
        }
    }

    private void RunCaptureAndNavigate()
    {
        while (true)
        {
            _startRetrieveEvent.WaitOne();
            _runCaptureEvent.WaitOne();

            _runCaptureEvent.Reset();
            _startRetrieveEvent.Reset();

            Invoke((MethodInvoker) ExecuteCapturing);

            Invoke((MethodInvoker) Activate);

            toolStripStatusLabel1.Text = "Page loading";
            webBrowser1.Navigate("google.com");
        }
    }

    private void ExecuteCapturing()
    {
        var input = ComFactory.Instance.NewWInput();
        input.Hwnd = _hwnd;
        input.StartX = _x;
        input.StartY = _y;
        input.Options = (int) W_CAPTURE_OPTIONS.wCaptureOptionsHighlightWords |
                        (int) W_CAPTURE_OPTIONS.wCaptureOptionsUseWindowsWordBreaking;

        var result = _wCapture.Capture(input);

        var text = string.Empty;
        if (result != null && string.IsNullOrEmpty(result.Text))
        {
            text = result.Text;
        }

        textBox1.Text = text;
    }
}

残念ながら、WordCaptureX コンポーネントのサポートは、ブラウザーの読み込みが滞る状況を回避するのに役立ちません。

ブラウザを再初期化する方法を知っている人はいますか?

4

0 に答える 0