DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ウィンドウがアクティブになるのを防ぎたい

環境/言語:[WinXp SP2 + VB2005 Express +.NET2.0]
分類:[.NET]

お世話になっております。

WebBrowserコントロールを使用して、複数のURLを読み込ませて
巡回するようにしています。

目的はデータの取得なので、ボタンを押したら後はウィンドウは
アクティブにならずに動いていてくれればいいのですが、
読み込んだページよって、勝手にウィンドウがアクティブになって
最前面に出てくるときがあります。
これを防ぎたいのですが、どのようにすればよいでしょうか?

CreateParamsをオーバーライドしてクリックしてもアクティブにならないようには
できたのですが、それでもHPが表示された後には最前面に出てきます。

本当はクリックしたときはアクティブになって欲しいので、
この勝手にアクティブになるのだけ防ぎたいです。

常にウィンドをアクティブにするサンプルは見つかったのですが、
上記のように逆の場合を見つけることができませんでした。

よろしくお願いします。
その後Googleで色々探してやってみました。
メインフォームのウィンドウメッセージをオーバライドして、
WM_WINDOWPOSCHANGINGの時にアクティブにならないように処理すればいいのでは?と思って、
以下のように書いてやってみたのですがやはりアクティブになってしまいます。

アクティブになるのを防ぐのにWM_WINDOWPOSCHANGINGで処理をするので
あっているのでしょうか?
まだ解決できていないので引き続きよろしくお願いします。


' 定数の定義
    Private Const HWND_TOPMOST As Integer = -1      ' 最全面に表示する
    Private Const HWND_NOTOPMOST As Integer = -2    ' 最前面に表示するのをやめる
    Private Const SWP_NOSIZE As Integer = &H1       ' サイズを変更しない
    Private Const SWP_NOMOVE As Integer = &H2       ' 位置を変更しない
    Private Const SWP_NOZODER As Integer = &H4      ' 現在のZオーダーを維持
    Private Const SWP_NOACTIVATE As Integer = &H10
    Private Const SWP_SHOWWINDOW As Integer = &H40
    Private Const SWP_NOSENDCHANGING As Integer = &H400     'WM_WINDOWPOSCHANGINGを送らない


    <Runtime.InteropServices.DllImport("user32.dll")> _
    Private Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As Integer, _
        ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
    End Function

    Structure WINDOWPOS
        Public hWnd As IntPtr              'ウィンドウのハンドル
        Public WndInsertAfter As IntPtr    'ウィンドウのZオーダをこのメンバで指定したウィンドウの前に置く。または、定数。
        Public x As Integer                'ウィンドウの左上隅のX座標
        Public y As Integer                '同、Y座標
        Public cx As Integer               'ウィンドウの幅
        Public cy As Integer               '同、高さ
        Public flags As Integer            'ウィンドウの位置と高さを指定するフラッグ
    End Structure

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        Const WM_WINDOWPOSCHANGING As Integer = &H46

        Select Case m.Msg
            Case WM_WINDOWPOSCHANGING
                Dim wp As New WINDOWPOS
                If m.LParam <> IntPtr.Zero Then
                    wp = DirectCast(m.GetLParam(GetType(WINDOWPOS)), WINDOWPOS)
                    SetWindowPos(wp.hWnd, HWND_NOTOPMOST, wp.x, wp.y, wp.cx, wp.cy, _
                      SWP_NOACTIVATE Or SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOSENDCHANGING)
                    Return
                End If
        End Select

        MyBase.WndProc(m)
    End Sub

DOBON.NET | プログラミング道 | プログラミング掲示板