Вопрос по url, internet-explorer, vba – Получить текущий URL в IE с помощью Visual Basic

6

Я работаю с объектом Internet Explorer в Visual Basic. Есть ли способ скопировать текущий URL, который отображает IE, чтобы я мог вставить его в другое место с моим буфером обмена?

Какое приложение? Excel, доступ ..? Fionnuala
Как вы связаны с текущим IE? Это важно, так как если открыто более 1 окна IE. Связываете ли вы IE с подписью? Показ нам больше кода на самом деле поможет. Если вы хотите, чтобы код получал URL из всех окон IE, тогда вы можете установить ссылку на элементы управления Microsoft Internet, а затем вы можете перебрать все окна IE, используяShellWindows, Как только вы получите окно, просто используйте.LocationURL чтобы получить адрес. Siddharth Rout
это может быть немного сложнее, чем вы хотите, и это VB.NET, но оно должно быть переводимым. Надеюсь, поможетGet URL Scott Holtzman

Ваш Ответ

2   ответа
6

что вы уже определили окно IE, которое само по себе немного сложнее - я могу уточнить это при необходимости:

Dim ieIEWindow As SHDocVw.InternetExplorer
Dim sIEURL As String

'Set your IE Window

sIEURL = ieIEWindow.LocationURL

Чтобы получить окно IE, вам нужно сослаться наMicrosoft Internet Controls библиотека (ieframe.dll) в редакторе VBA, перейдя вTools= & GT;References... и выбрав его из списка. Если этот элемент недоступен, файл .dll для меня находится по адресуC:\Windows\System32\ieframe.dll.

Как только ссылка установлена, у вас будет доступ к так называемойSHDocVw библиотека в вашем коде.

Вы можете получить окно IE (при условии, что открыто только одно), используя следующее (не проверено, изменено / уменьшено из моего собственного рабочего кода):

Public Function GrabIEWindow() As SHDocView.InternetExplorer

Dim swShellWindows As New SHDocVw.ShellWindows
Dim ieOpenIEWindow As SHDocVw.InternetExplorer

    Set GrabIEWindow = Nothing

    ' Look at the URLs of any active Explorer windows 
    ' (this includes WINDOWS windows, not just IE)
    For Each ieOpenIEWindow In objShellWindows

        ' Check the I.E. window to see if it's pointed 
        ' to a web location (http)
        If Left$(ieOpenIEWindow.LocationURL, 4) = "http" Then
            ' If so, set this window as the one to use. 
            ' This will need to be modified to create
            ' a list if you want to select from more
            ' than one open window

            ' Optional grab the HWND for later reference...
            Dim lWindowID As Long
            lWindowID = ieOpenIEWindow.HWND

            Set GrabIEWindow = ieOpenIEWindow

            Exit Function
        End If

    Next OpenIEWindow 

End Function

Вышеприведенное также может быть изменено, чтобы обеспечить выбор нескольких открытых окон IE.

@SiddharthRout Я использую этот вид автоматизации ежедневно и разработал некоторые грязные, но эффективные инструменты для достижения этой цели. (форма, в которой перечислены все доступные окна, пользователь выбирает, сессия затем связывается с HWND, в некоторых случаях гарантируя, что окно все еще открыто, и т. д.)
@SiddharthRout Возможно, но, опять же, я предполагаю, что у них уже есть определенное окно, что означает, что ониshould уже есть это ... Добавление сейчас.
+ 1 Да Если открыто только одно окно или если идентифицировано окно IE.
Kool :) Вы можете изменить свой пост и добавить, что пользователь должен добавить ссылку на Microsoft Internet Controls?
2

Хорошо, вот что у меня есть. Если есть больше чем 1 окно IE, тогда он примет последний активный (Current) IE окно еще, если есть только одно окно, то это займет.

'~~> Set a reference to Microsoft Internet Controls

'~~> The GetWindow function retrieves the handle of a window that has
'~~> the specified relationship (Z order or owner) to the specified window.
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, _
ByVal wCmd As Long) As Long

'~~> The GetForegroundWindow function returns the handle of the foreground
'~~> window (the window with which the user is currently working).
Private Declare Function GetForegroundWindow Lib "user32" () As Long

Sub GetURL()
    Dim sw As SHDocVw.ShellWindows
    Dim objIE As SHDocVw.InternetExplorer
    Dim topHwnd As Long, nextHwnd As Long
    Dim sURL As String, hwnds As String

    Set sw = New SHDocVw.ShellWindows

    '~~> Check the number of IE Windows Opened
    '~~> If more than 1
    hwnds = "|"
    If sw.Count > 1 Then
        '~~> Create a string of hwnds of all IE windows
        For Each objIE In sw
            hwnds = hwnds & objIE.hwnd & "|"
        Next

        '~~> Get handle of handle of the foreground window
        nextHwnd = GetForegroundWindow

        '~~> Check for the 1st IE window after foreground window
        Do While nextHwnd > 0
            nextHwnd = GetWindow(nextHwnd, 2&)
            If InStr(hwnds, "|" & nextHwnd & "|") > 0 Then
                topHwnd = nextHwnd
                Exit Do
            End If
        Loop

        '~~> Get the URL from the relevant IE window
        For Each objIE In sw
            If objIE.hwnd = topHwnd Then
                sURL = objIE.LocationURL
                Exit For
            End If
        Next
    '~~> If only 1 was found
    Else
        For Each objIE In sw
            sURL = objIE.LocationURL
        Next
    End If

    Debug.Print sURL

    Set sw = Nothing: Set objIE = Nothing
End Sub

NOTE: Я не делал обработки ошибок. Я уверен, что вы можете позаботиться об этом;)

Как я уже говорил, я не включил обработку ошибок. с помощьюLeft$(ieOpenIEWindow.LocationURL, 4) = "http" как вы сделали, это был бы мой следующий шаг, но я тестировал с 3 действительными окнами IE с реальными адресами. :) Попробуйте более 1 окна IE и посмотрите, какой URL вы получите?
Это немного отличается от моих методов! Я использую некоторые внешние ссылки на dll, но только для манипулирования страницами (т. Е. Переключаться между несколькими). Как вы справляетесьsw.Count = 1 когда единственное окно имеет путь не из http, поскольку окно может быть стандартным фреймом Windows (т.е.My Computer)?

Похожие вопросы