自宅サーバの整理箱

自宅サーバを構築しwordpress,fedora,CentOSの作業メモ

*

VB.netですでに開かれたIEを補足、IEオブジェクトへ変換する方法を

   

VB.netで、すでに開かれたIEを補足する方法を纏めました。
自分でIEオブジェクトを作成する場合は簡単に操作できますが、他のプロセスがひらいたり、すでに開かれたウィンドウ、ポップアップした画面等をVB.NETから操作したい場合に使える技です。

images

Module mdlDllImportを作成する

WindowsシステムのAPIであるWin32 APIの機能を呼び出しますので、以下をコピペでmdlDllImportモジュールを作成します。

Imports System.Runtime.InteropServices
Imports System.Text

Module mdlDllImport

    <DllImport("user32")> _
    Function FindWindowExA( _
    	ByVal hWnd1 As IntPtr, _
    	ByVal hWnd2 As IntPtr, _
    	ByVal lpsz1 As String, _
    	ByVal lpsz2 As String) As IntPtr
    End Function

    <DllImport("user32")> _
    Function GetClassName( _
        <[In]()> ByVal hWnd As IntPtr, _
        <Out()> ByVal lpClassName As StringBuilder, _
        <[In]()> ByVal nMaxCount As Integer _
        ) As Integer
    End Function

    <DllImport("user32")> _
    Function EnumChildWindows( _
        <[In]()> ByVal hWndParent As IntPtr, _
        <[In]()> ByVal lpEnumFunc As EnumChildProc, _
        <[In]()> ByRef lParam As IntPtr _
        ) As Boolean
    End Function

    <DllImport("user32")> _
    Function RegisterWindowMessage( _
        <[In]()> ByVal lpString As String _
        ) As Integer
    End Function

    <DllImport("user32")> _
    Function SendMessageTimeout( _
       <[In]()> ByVal hWnd As IntPtr, _
       <[In]()> ByVal msg As Integer, _
       <[In]()> ByVal wParam As Integer, _
       <[In]()> ByVal lParam As Integer, _
       <[In]()> ByVal fuFlags As Integer, _
       <[In]()> ByVal uTimeout As Integer, _
       <Out()> ByRef lpdwResult As IntPtr _
        ) As Integer
    End Function

    <DllImport("oleacc")> _
    Function ObjectFromLresult( _
       <[In]()> ByVal lResult As Int32, _
       <[In]()> ByRef riid As System.Guid, _
       <[In]()> ByVal wParam As Int32, _
       <Out(), MarshalAs(UnmanagedType.Interface)> ByRef ppvObject As Object _
        ) As Integer
    End Function

End Module

メインを作成する

補足するIEのタイトル名称を指定します。
指定した画面タイトルを持つIEオブジェクトを探します。

    Private Sub main()
    
        Dim PWnd As IntPtr
        Dim objIE As Object

        strCaption = "IEタイトルを指定します"
        PwndList = New List(Of IntPtr)

        While True
            System.Threading.Thread.Sleep(1000)
            PWnd = FindWindowExA(0, 0, "Internet Explorer_TridentDlgFrame", strCaption)

            'ウィンドウハンドルからIEオブジェクトを取得
            If PWnd <> 0 Then

                'IEオブジェクト取得
                objIE = GetIEDocument(PWnd)

            End If

        End While
    End Sub

■IEオブジェクト、ウィンドウハンドルを取得する
以下メソッドをコピペします。IEオブジェクトを検索し、ウィンドウハンドルからIEオブジェクトを返すメソッドになります。

	'IEオブジェクト取得メソッド
    Private Function GetIEDocument(ByVal hWnd As IntPtr) As Object
        Dim hWndChild As IntPtr
        Dim nMsg As Integer
        Dim lRes As Integer
        Dim IID_IHTMLDocument As System.Guid = New System.Guid("626FC520-A41E-11CF-A731-00A0C9082637")
        Dim SMTO_ABORTIFHUNG As Integer = &H2
        Dim spDoc As Object = Nothing

        If Not hWnd = IntPtr.Zero Then
            EnumChildWindows(hWnd, AddressOf EnumChild, hWndChild)
            If Not hWndChild = IntPtr.Zero Then
                nMsg = RegisterWindowMessage("WM_HTML_GETOBJECT")
                SendMessageTimeout(hWndChild, nMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes)
                If Not lRes = IntPtr.Zero Then
                    ObjectFromLresult(lRes, IID_IHTMLDocument, 0, spDoc)
                End If
            End If
        End If

        Return spDoc
    End Function

	'Internet Explorerウィンドウハンドル取得
    Private Function EnumChild(ByVal hWnd As IntPtr, ByRef lParam As IntPtr) As Boolean
        Dim buf As New StringBuilder(100)

        GetClassName(hWnd, buf, buf.MaxCapacity)
        If buf.ToString = "Internet Explorer_Server" Then
            lParam = hWnd
            Return False
        Else
            Return True
        End If
    End Function

これで完成です。
メインで指定した「strCaption」のタイトルを持つInternetExplorerを1秒周期で監視し続けます。見つかった場合はウィンドウハンドルからIEオブジェクトを取得します。

IEオブジェクトが取得できれば、あとは自動操作できます。

 - InternetExplorer, スクレイピング

 Total 899 views