4

を使用してフォーム内の WebBrowser コントロールにマウス クリックを送信しようとしPostMessage()ましたが、かなり重大な問題に遭遇しました。私が達成しようとしているのは、フォームが最小化されている間にこの WebBrowser でマウス クリックをシミュレートすることです。通常PostMessage()はこれで問題なく動作しますが、フォームにフォーカスがある場合にのみ機能するようです。これにより、WebBrowser コントロールにロードしている特定の Web サイトがマウス イベントを処理する前にフォーカスされているかどうかを確認するためのチェックが行われていると思われます。

これは、プログラムでクリックを送信する方法です。

private void SendClick(Point location)
    {            
        resetHandle = true;
        StringBuilder className = new StringBuilder(100);
        while (className.ToString() != "Internet Explorer_Server") 
        {
            handle = GetWindow(handle, 5); // 5 == child
            GetClassName(handle, className, className.Capacity);
            //MessageBox.Show(className.ToString());
        }
        IntPtr lParam = (IntPtr)((location.Y << 16) | location.X); 
        IntPtr wParam = IntPtr.Zero; 
        const uint downCode = 0x201; 
        const uint upCode = 0x202;
        const uint moveCode = 0x200;
        PostMessage(handle, moveCode, wParam, lParam); //move mouse
        PostMessage(handle, downCode, wParam, lParam); // mousedown
        PostMessage(handle, upCode, wParam, lParam); // mouseup
    }

これは resetHandle が行うことです:

private void timer3_Tick(object sender, EventArgs e)
    {
        if (resetHandle == true)
        {
            handle = webBrowser1.Handle;
            resetHandle = false;
        }
    }

マウス イベントをバックグラウンド ウィンドウに送信するより良い方法があるかどうかはわかりませんが、どんなアイデアも受け入れます。私が本当に求めているのは、実際にはまだ最小化されているときに、ウィンドウにフォーカスがあると信じ込ませることができるかどうかです。

どんな助けでも大歓迎です!

4

1 に答える 1

1

ウィンドウを最小化したままにするのではなく、通常の状態 (復元) に保ちますが、X または Y 座標を設定して、ウィンドウが画面外に配置されるようにします。

ユーザーに最小化と復元の錯覚を与えたい場合は、 HwndSource.AddHook を使用してSC_MINIMIZEを監視します。ハンドラーで、HwndSourceHook疑似最小化状態に応じてウィンドウを画面上または画面外に移動し、handledtrue に設定します。

于 2012-12-17T10:42:01.810 に答える