2

他のボタンを持つフォームに .NET の WebBrowser を埋め込みました。

私が開発しているアプリケーションは、キーボードを使用せず、タッチスクリーンを使用します。したがって、実際にはマウスのみを使用します。ウェブブラウザを下にスクロールするために、2 つのカスタム ボタンを作成しました。これらのボタンをクリックすると、「PageDown」キーストロークがブラウザに送信され、ブラウザが下にスクロールするはずです。

したがって、クリック イベントのコードは次のようになります。

        theForm.Activate();
        Application.DoEvents();
        theBrowser.Focus();
        Application.DoEvents();
        SendKeys.Send(key);

「theForm」はフォーム、「theBrowser」はブラウザ インスタンスです。

そのため、ボタンをクリックしても何も起こりません。最初にブラウザをクリックしてからボタンをクリックすると、機能します。しかし、私はそれに焦点を当てていますか?そして、アプリケーションにフォーカスを設定するのに十分なスペースを与えましたか?

でも今思うと不思議です。MessageBox.Show("HELLO"); を入れると コードでは、次のようにします。

    theForm.Activate();
    Application.DoEvents();
    theBrowser.Focus();
    MessageBox.Show("HELLO");
    Application.DoEvents();
    SendKeys.Send(key);

...ボタンをクリックするとすぐに機能します。

 

問題は、MessageBox.Show() を使用しないとこのコードが機能しないのに、MessageBox.Show() を使用すると機能するのはなぜですか?

お役に立てば幸いです。よろしくお願いします...

4

5 に答える 5

1

あなたのアプローチが正しいかどうかに入ることなく。(そして私はそうではないと思います)。

私はあなたが競合状態にあることを賭けます。つまり、ブラウザコントロールは、イベントの読み込みと応答に、許可している時間よりも多くの時間を必要とします。

したがって、Message.Showを実行すると、突然、イベントを送信するスレッドがブロックされ、ブラウザの制御が完全に初期化されるか、他の何かが可能になります。

タッチに対処するためのより良いアプローチがあるため、モバイルで実行しているのか、通常のデスクトップで実行しているのかを質問から判断するのは困難です。マルチタッチまたはWPF4.0(Surface Touch SDKでも共有されている)のWindow7Apiを見てください。

お役に立てば幸いです。アリエル

于 2009-05-26T08:03:24.007 に答える
1

私には、これは間違った方法のように見えます。

このC++サンプルまたはこのC#サンプルに沿って何かを試してください。

キーの押下をシミュレートする場合は、少なくともメッセージの送信先のHWNDについて明示してください。

于 2009-05-26T08:07:56.150 に答える
0

ブラウザコントロールがまだドキュメントをロードしていて、メッセージボックスが終了するのに十分な時間を与えている可能性があります。その場合は、ブラウザのIsBusyプロパティがfalseになるまで待つか、DocumentCompletedイベントを使用してください。

于 2009-05-26T08:03:26.783 に答える
0

わかりませんが、一般的に私の経験では、このようにプログラムでフォーカスを変更しようとするのは悪い考えです。常にバグハントに陥ります。ただし、ウィンドウをスクロールさせる方法はたくさんあるので、別の方法を試してみてください。たとえば、WebブラウザのJavaScriptは、ウィンドウを効果的にスクロールできます。

于 2009-05-26T08:04:04.287 に答える
0

ここで最初に行われるレースがあるのではないかと思います。コントロールのフォーカスは瞬時ではなく、送信したキーストロークは別の場所に移動する可能性がありますが、メッセージボックスを閉じた後、ブラウザコントロールはすでにフォーカスされており、キーストロークを取得します。

また、 Control.Focus()に関するMSDNからのメモを引用するには:

フォーカスは、主にカスタムコントロールの作成者を対象とした低レベルの方法です。代わりに、アプリケーションプログラマーは、子コントロールの場合はSelectメソッドまたはActiveControlプロパティを使用するか、フォームの場合はActivateメソッドを使用する必要があります。

したがって、Focus()を使用するよりも、これらの1つを使用する方がよい場合があります。

于 2009-05-26T08:04:27.750 に答える