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 コンポーネントのサポートは、ブラウザーの読み込みが滞る状況を回避するのに役立ちません。
ブラウザを再初期化する方法を知っている人はいますか?