やりたいことはInternetExplolerを6窓オープンさせていて(表示内容はそれぞれ違います)
その6窓の中から指定した窓を検索しその表示内容を取り込みたいのです。
APIとwebbrowserを駆使すれば簡単に出来そうなのですがなかなか出来ません。教えてください。
順序としてはまずFindWindow関数で指定した
窓を検索しそのプロセス番号を取得し
そのプロセスを元にSetActiveWindow関数で
希望の窓をアクティヴにしその後webbrowserのDocumentで取り込むという方法です。
問題の出ている点はどうも指定した窓を
アクティブできない為に一番前(左)の窓の
HP内容ばかり取得してしまいます。
SetActivewindowは間違いなのでしょうか
他に方法等あれば教えて下さい。また、
webbrowserのHP内容取得って一つの窓しか
出来ないのでしょうか? よろしくお願いします。VB6.0です。
>一番前(左)の窓のHP内容ばかり取得してしまいます。
FindWindowを使っているからでは?
列挙したかったらEnumWindowsを使うとか。
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
> 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
ありがとうございます。早速起動してみたのですが
どうも動きません。以下がソースです。
テキスト形式で取れそうなのはうれしいのですが
取り込む窓はどの変数で指定すればいいのか
よく分かりません、ご指導よろしくお願いします。
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
> 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; ")"
これでもまだ不足なようであれば、各ウィンドウをどのように区別したいのかを明確にしていただければ、何らかの回答ができるかも知れません。
おーなるほど、理解しました。今出先なので
帰ってまた実験してみます。
魔界の仮面弁士様、あなたは何者ですか
命の恩人です。ありがとうございます。
ツイート | ![]() |