tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルIE
記事No7130
投稿日: 2008/03/04(Tue) 17:53
投稿者はれ
Vista XP WIN2000
VB2005

フォームAから
IEをディスクトップ最前面起動させるPG作成をしております。

パターン1
wb = New WebBrowser
wb.Navigate("URL", True)
wb.BringToFront() '←意味があるか不明

パターン2
Dim Mypro As Process
Dim startInfo As New ProcessStartInfo("IExplore.exe")
startInfo.WindowStyle = ProcessWindowStyle.Normal ’←意味があるか不明
startInfo.CreateNoWindow = False
startInfo.Arguments = "URL"
Mypro = Process.Start(startInfo)


パターン3
Dim hProcess As System.Diagnostics.Process = System.Diagnostics.Process.Start("iexplore", "URL")’パターン2の方が良い?
hProcess.WaitForInputIdle()  
 
と作ってみましたがイマイチ不明です。
また、SetWindowPos APIはVistaでは役に立ちませんでした。
どなたかご教示ください。

[ツリー表示へ]
タイトルタイトルは「IEの最前面起動」ですね
記事No7131
投稿日: 2008/03/04(Tue) 17:59
投稿者クレイオ
タイトルは「IEの最前面起動」ですね。
タイトルはきちんと入れましょう。

[ツリー表示へ]
タイトルRe: IE を最前面に表示
記事No7132
投稿日: 2008/03/05(Wed) 12:38
投稿者花ちゃん
IE を別窓で、最前面に表示したいなら、その表示している IE のウィンドウの
ハンドルを取得して、そのハンドルを操作する必要がありますが、投稿された
コードには、それらが見られませんが、その辺はどのようにされているのでしょうか?

>また、SetWindowPos APIはVistaでは役に立ちませんでした。
>どなたかご教示ください。

との事ですが、私の作ったサンプル No.234 では(Vista上でも)問題なく
動作しております。

http://hanatyan.sakura.ne.jp/dotnet/Sample.htm

試しに、IE のウィンドウのハンドルを取得して、SetWindowPos 関数を実行してみたら
最前面に表示されました。

[ツリー表示へ]
タイトルRe^2: IE を最前面に表示
記事No7150
投稿日: 2008/03/07(Fri) 09:36
投稿者はれ
お返事ありがとうございます。
-----------------------------------------------------------------------
今試しにVB6で実行していた方式 
ただし Option Strict Off

Dim ob As Object
ob = CreateObject("InternetExplorer.application")
ob.navigate("URL")
ob.Visible = True
'常に最前面に表示
SetWindowPos(ob.hwnd, -1, ob.Left, ob.Top, ob.Width, ob.Height, &H40S)
ob = Nothing 'これをつけると効かない時がある?

をVistaで試してみますと現在は有効です。
しかし、過去に数回Vistaで有効でない時がありました。

[ツリー表示へ]
タイトルRe^3: IE を最前面に表示
記事No7151
投稿日: 2008/03/07(Fri) 09:48
投稿者はれ
ちなみに以下の方式では常に全面が有効になりませんでした。

        Dim Mypro As Process
        Dim startInfo As New ProcessStartInfo("IExplore.exe")
        startInfo.WindowStyle = ProcessWindowStyle.Normal
        startInfo.CreateNoWindow = False
        startInfo.Arguments = "URL"
        Mypro = Process.Start(startInfo)
        SetWindowPos(Mypro.MainWindowHandle.ToInt32, -1, 100, 100, 500, 500, &H40S)
'常に前面表示が効きません。

(VB6で行っていた方式はVistaが出て間もない時に効かない事を実験しております。
VB6-XPSP2コンパイル。Vistaで実験。IEが後ろに下がる時があり。)
おかしいな〜?が正直な思いです。
何かおかしなコードがございましたら
遠慮なく突っ込んで下さいますようお願いいたします。

[ツリー表示へ]
タイトルRe^4: IE を最前面に表示
記事No7152
投稿日: 2008/03/07(Fri) 09:58
投稿者花ちゃん
先にも書きましたが、前面に表示したいウィンドウのハンドルを取得しないと
前面には表示できません。

SetWindowPos(Mypro.MainWindowHandle.ToInt32, -1, 100, 100, 500, 500, &H40S)
これでは、Mypro.MainWindowHandle.ToInt32 は 0 になっていてハンドルが
取得できていないはずです。
(IE のウィンドウが表示される前にハンドルを取得しているからです)

[ツリー表示へ]
タイトルRe^5: IE を最前面に表示
記事No7153
投稿日: 2008/03/07(Fri) 13:14
投稿者はれ
> 先にも書きましたが、前面に表示したいウィンドウのハンドルを取得しないと
> 前面には表示できません。
>
> SetWindowPos(Mypro.MainWindowHandle.ToInt32, -1, 100, 100, 500, 500, &H40S)
> これでは、Mypro.MainWindowHandle.ToInt32 は 0 になっていてハンドルが
> 取得できていないはずです。
> (IE のウィンドウが表示される前にハンドルを取得しているからです)

ご指摘ありがとうございます。

ということはEnumWndProc等を使用して「IEタイトル」等で目的のハンドルを特定して
SetWindowPosにほうり込む方法しかないのでしょうか?
APIを使用するしかないのでしょうか?

リンクラベルのサンプルがMSに載っていますが
「  System.Diagnostics.Process.Start("IExplore.exe", "URL") ’MSDN」
これだととりあえずIE起動表示時に最前面に表示されるのでは?
と予想しているのですがご意見お聞かせいただけたら助かります。

[ツリー表示へ]
タイトルRe^6: IE を最前面に表示
記事No7154
投稿日: 2008/03/07(Fri) 14:33
投稿者花ちゃん
> ということはEnumWndProc等を使用して「IEタイトル」等で目的のハンドルを特定して
> SetWindowPosにほうり込む方法しかないのでしょうか?
> APIを使用するしかないのでしょうか?

別窓で表示させた場合は、そのようにするしかないのでは。
Form 上に表示した WebBrowser 内に表示させた場合なら  Me.TopMost = True でも可能
ですが。


> リンクラベルのサンプルがMSに載っていますが
どれの事でしょうか?

> 「  System.Diagnostics.Process.Start("IExplore.exe", "URL") ’MSDN」
> これだととりあえずIE起動表示時に最前面に表示されるのでは?
これだけでは、常に最前面に表示される事はありません。

どのように指定のウィンドウを表示させたいかで取得方法も変わってきますが、
下記コードで実験して見て下さい。
コメントを付けたままと、外した状態で比べて見て下さい。
(同じ事をメモ帳で実験すると違う答えになります)

Private Sub Button2_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button2.Click
   Dim p As Process = New Process
   p.StartInfo.FileName = "IExplore.exe"
   p.Start()
   p.WaitForInputIdle()

'   System.Threading.Thread.Sleep(1000)

   Debug.WriteLine(p.MainWindowHandle)
   Dim Ret As Integer = SetWindowPos(p.MainWindowHandle, HWND_TOPMOST _
                                   , 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
   p.Close()
End Sub

[ツリー表示へ]
タイトルRe^7: IE を最前面に表示
記事No7155
投稿日: 2008/03/07(Fri) 15:42
投稿者はれ
ご教示ありがとうございました。
やっと疑問が解決いたしました。

同じタイトルのIEが多数開いている可能性+別ウィンドウでIEを起動するので、
ハンドルが取れるまでしばしループ等で待機させて、取れたらAPI呼び出し。
一定時間以上経っても取れなければそのまま表示する仕様で行こうと思います。

リンクラベルのサンプルは
方法 : Windows フォーム LinkLabel コントロールでオブジェクトまたは Web ページにリンクする
で載っていました。

長々とお付き合いいただき感謝!感謝!
ありがとうございました。

[ツリー表示へ]
タイトルRe^8: IE を最前面に表示
記事No7158
投稿日: 2008/03/07(Fri) 16:37
投稿者花ちゃん
> ハンドルが取れるまでしばしループ等で待機させて、取れたらAPI呼び出し。
> 一定時間以上経っても取れなければそのまま表示する仕様で行こうと思います。

果たして、うまく行きますかな?
下記で、コメントを外した場合とそうでない場合を比べて見て下さい。
詳しい理由は知りませんが、表示される前に一旦取得すると以後取得できない。
従って、ループで待っても無駄なような気がします。

Private Sub Button3_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button3.Click
   Dim p As System.Diagnostics.Process = _
   System.Diagnostics.Process.Start("IExplore.exe", "http://hanatyan.sakura.ne.jp/")
'   Debug.WriteLine(p.MainWindowHandle)      '表示される前に一旦取得すると以後取得できない
   System.Threading.Thread.Sleep(2000)
   Debug.WriteLine(p.MainWindowHandle)
   p.Close()
End Sub

[ツリー表示へ]
タイトルRe^9: IE を最前面に表示
記事No7160
投稿日: 2008/03/07(Fri) 18:06
投稿者はれ
振り出しに戻ってしまいました。

[ツリー表示へ]
タイトルRe^10: IE を最前面に表示
記事No7167
投稿日: 2008/03/08(Sat) 11:18
投稿者花ちゃん
COM オブジェクトを使っていいのなら下記で常に最前面に表示されます。
Windows Vista  VB2005  IE7.0 で動作確認

'プロジェクト→参照の追加→COM→Microsoft Internet controls を参照設定して下さい。
Private Sub Button4_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button4.Click
   Dim IE As New SHDocVw.InternetExplorer
   Dim Url As String = "http://hanatyan.sakura.ne.jp/"
   SetWindowPos(IE.HWND, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
   With IE
      .Navigate(Url)
      Application.DoEvents()
      Do While .Busy = True
         Application.DoEvents()
      Loop
      .Visible = True
      Do While IE.ReadyState <> SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE
         Application.DoEvents()
      Loop
   End With
   System.Runtime.InteropServices.Marshal.FinalReleaseComObject(IE)
   IE = Nothing
End Sub

[ツリー表示へ]
タイトルRe^11: IE を最前面に表示
記事No7173
投稿日: 2008/03/10(Mon) 13:18
投稿者はれ
VB2005で作成EXE。

Vista+IE7
XPsp2+IE7
WIN2000sp4+IE6

で動作を確認いたしました。
COMで行うことにしました。
ありがとうございました!

追記
WIN2000でテスト中、IE起動直後にIEを終了させると例外エラーが発生しました。
エラー処理でキャッチできるようなので、tryにて回避いたしまいた。

[ツリー表示へ]
タイトルRe^12: IE を最前面に表示
記事No7229
投稿日: 2008/03/21(Fri) 14:43
投稿者はれ
IEの表示について新たな疑問があります。

No.7167で教えていただいた方法で
IEの表示を試したところ、
ソースで実行した場合は
IEがすでに起動していても
新たなウィンドウで表示されますが、
EXEにコンパイルして実行したところ
すでに起動しているIEのウィンドウに
新しいタブで表示されてしまいました。

また、IE7のオプション(タブ設定)にて
常に新しいウィンドウで開く設定にしても
動作は変わりませんでした。

(上記動作はすべてVistaで確認しました)


なお、XPでIE7をインストールしているPCで
EXEを実行したところ、
こちらは新たなウィンドウで表示されました。

Vista故の動作なんでしょうか?

独自ブラウザの作成も考慮に入れています。

[ツリー表示へ]