複数のIE画面からひとつを選択し取り込むには?


じろう  2004-09-30 10:09:56  No: 85822

やりたいことはInternetExplolerを6窓オープンさせていて(表示内容はそれぞれ違います) 
その6窓の中から指定した窓を検索しその表示内容を取り込みたいのです。
APIとwebbrowserを駆使すれば簡単に出来そうなのですがなかなか出来ません。教えてください。

順序としてはまずFindWindow関数で指定した
窓を検索しそのプロセス番号を取得し
そのプロセスを元にSetActiveWindow関数で
希望の窓をアクティヴにしその後webbrowserのDocumentで取り込むという方法です。

問題の出ている点はどうも指定した窓を
アクティブできない為に一番前(左)の窓の
HP内容ばかり取得してしまいます。

SetActivewindowは間違いなのでしょうか
他に方法等あれば教えて下さい。また、
webbrowserのHP内容取得って一つの窓しか
出来ないのでしょうか? よろしくお願いします。VB6.0です。


Say  2004-09-30 17:09:33  No: 85823

>一番前(左)の窓のHP内容ばかり取得してしまいます。

FindWindowを使っているからでは?
列挙したかったらEnumWindowsを使うとか。


じろう  2004-09-30 20:24:07  No: 85824

Enumwindowsですか検討してみます。ありがとうございます。
一応、ソースを添付します。一番悩んでる点はプロセス番号で
キーボード入力やwebbrowserで取り込めるHPを選択する関数です。
SetActivewindowやSetfocusAPIやSetForegroundWindowや何を使えば
いいのやら。色々試してますがプロセス番号でIEの窓をアサインすることは
無理なのでしょうか。もう3ヶ月も悩んでます。お助け下さい。

Option Explicit

Private WithEvents ie  As SHDocVw.WebBrowser
Private doc As MSHTML.HTMLDocument

Private Declare Function FindWindow Lib "user32.dll" _
    Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" _
    Alias "FindWindowExA" ( _
    ByVal hwndParent As Long, _
    ByVal hwndChildAfter As Long, _
    ByVal lpszClass As String, _
    ByVal lpszWindow As String) As Long
Private Declare Function GetWindowText Lib "user32.dll" _
    Alias "GetWindowTextA" ( _
    ByVal hWnd As Long, _
    ByVal lpString As String, _
    ByVal nMaxCount As Long) As Long
    
Private Declare Function SetForegroundWindow Lib "USER32" (ByVal sWnd As Long) As Long
Private Declare Function SetFocusAPI Lib "USER32" Alias "SetFocus" (ByVal hWnd&) As Long

'フォームロード
Private Sub Form_Load()
    Dim sw As New SHDocVw.ShellWindows
    Dim lngHwnd        As Long
    Dim strTitle    As String * 512
    Dim hhh As String
    Dim df
    Dim rr As Long
    Dim v
    Dim fj As String
    
    Dim j
    List1.Clear
    
    lngHwnd = 0
    Do
        
 lngHwnd = FindWindowEx(0, lngHwnd, "IEFrame", vbNullString)
        If lngHwnd = 0 Then Exit Do
        Call GetWindowText(lngHwnd,strTitle,Len(strTitle))
             
        
        List1.AddItem Left(strTitle, InStr(strTitle, vbNullChar) - 1)
        hhh = Left(strTitle, InStr(strTitle, vbNullChar) - 1)
        
        '指定の窓かチェックする
        
        j = 0
        j = InStr(hhh, "指定の窓")
        
        '指定の窓なら出口へ
        If j > 0 Then Exit Do
    Loop
    
    '指定の窓の場合
    If j > 0 Then
              
       '指定の窓をアクティブウィンドウにする
       rr = SetForegroundWindow(lngHwnd)
              
       'SetFocusAPI hhh

       'webbrowserで表示する
        If sw.Count = 0 Then
           MsgBox "Internet Explorer を先に立ち上げてください"
        End
       End If
       Set ie = sw(0)
       Set doc = ie.Document
       fj = doc.body.innerText
       MsgBox fj


魔界の仮面弁士  2004-09-30 20:53:20  No: 85825

> Dim sw As New SHDocVw.ShellWindows

ShellWindowsコレクションを使っておられるようですが、
それなら、EnumWindows APIを使わなくてもIEを列挙できますよ。

Dim Obj As Object
On Error Resume Next
For Each Obj In CreateObject("Shell.Application").Windows
    Debug.Print "hWnd=0x" & Hex(Obj.hWnd)
    If TypeName(Obj.document) = "HTMLDocument" Then
        'Debug.Print Obj.document.documentElement.outerHTML
        Debug.Print Obj.document.documentElement.outerText
    Else
        Debug.Print "HTML以外(フォルダ等)が表示されています"
    End If
    Debug.Print String(50, "*")
Next


じろう  2004-09-30 21:53:46  No: 85826

ありがとうございます。早速起動してみたのですが
どうも動きません。以下がソースです。

テキスト形式で取れそうなのはうれしいのですが
取り込む窓はどの変数で指定すればいいのか
よく分かりません、ご指導よろしくお願いします。

Private Sub Form_Load()
    Dim sw As New SHDocVw.ShellWindows
    Dim Obj As Object
On Error Resume Next
For Each Obj In CreateObject("Shell.Application").Windows
    Debug.Print "hWnd=0x" & Hex(Obj.hWnd)
    If TypeName(Obj.document) = "HTMLDocument" Then
        'Debug.Print Obj.document.documentElement.outerHTML
        Debug.Print Obj.document.documentElement.outerText
    Else
        Debug.Print "HTML以外(フォルダ等)が表示されています"
    End If
    Debug.Print String(50, "*")
Next

End Sub


魔界の仮面弁士  2004-10-01 00:18:24  No: 85827

> Dim sw As New SHDocVw.ShellWindows
ここで作成された sw は、
> For Each Obj In CreateObject("Shell.Application").Windows
ここで指定した CreateObject("Shell.Application").Windows と同義です。

> 取り込む窓はどの変数で指定すればいいのか
その前のコードで、FindWindow(Ex) を使っておられたので、ウィンドウハンドル(hWndプロパティ)さえ取得出来れば良いのかと思い、あのようなコードを掲載したわけですが…… hWnd だけでは不足でしたか?

ウィンドウハンドル以外の情報としては、
・現在表示中のアドレス(InternetExplorerオブジェクトのLocationURLプロパティ)
・表示されている位置(同オブジェクトのLeft/Top/Width/Heightプロパティ)
なども取得出来ますが…。

Debug.Print "hWnd=0x" & Hex(Obj.hWnd)
Debug.Print "URI=" & Obj.LocationURL
Debug.Print "Pos=("; Obj.Left; ","; Obj.Top; ")-(";
Debug.Print Obj.Left + Obj.Width; ","; Obj.Top + Obj.Height; ")"

これでもまだ不足なようであれば、各ウィンドウをどのように区別したいのかを明確にしていただければ、何らかの回答ができるかも知れません。


じろう  2004-10-01 00:35:22  No: 85828

おーなるほど、理解しました。今出先なので
帰ってまた実験してみます。
魔界の仮面弁士様、あなたは何者ですか
命の恩人です。ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加