2012-06-22 40 views
6

Tôi đang làm việc với đối tượng Internet Explorer trong Visual Basic. Có cách nào để sao chép URL hiện tại mà IE đang hiển thị để tôi có thể dán nó ở nơi khác bằng khay nhớ tạm của tôi không?Nhận URL hiện tại trong IE Sử dụng Visual Basic

+0

điều này có thể phức tạp hơn một chút so với bạn muốn, và đó là VB.NET, nhưng nó phải được dịch. Hy vọng nó sẽ giúp [Nhận URL] (http://www.codeproject.com/Articles/204929/Getting-current-browser-URL-with-VB-NET) –

+0

Ứng dụng nào? Excel, Access ..? – Fionnuala

+0

Bạn đã kết nối với IE hiện tại như thế nào? Điều này là quan trọng như những gì nếu có nhiều hơn 1 cửa sổ IE mở. Bạn có ràng buộc với IE dựa trên chú thích không? Hiển thị cho chúng tôi nhiều mã hơn sẽ thực sự hữu ích. Nếu bạn muốn mã nhận URL từ tất cả các cửa sổ IE thì bạn có thể đặt tham chiếu đến Microsoft Internet Controls và sau đó bạn có thể lặp qua tất cả các cửa sổ IE bằng cách sử dụng 'ShellWindows'. Khi bạn nhận được cửa sổ, chỉ cần sử dụng '.LocationURL' để nhận địa chỉ. –

Trả lời

6

Giả sử bạn đã có cửa sổ IE xác định, mà tự nó là một chút phức tạp hơn - tôi có thể xây dựng trên này nếu cần thiết:

Dim ieIEWindow As SHDocVw.InternetExplorer 
Dim sIEURL As String 

'Set your IE Window 

sIEURL = ieIEWindow.LocationURL 

Để có được cửa sổ IE, bạn sẽ cần phải tham khảo thư viện Microsoft Internet Controls (ieframe.dll) trong trình chỉnh sửa VBA bằng cách truy cập Tools =>References... và chọn từ danh sách. Nếu mục đó không có sẵn, tệp .dll cho tôi nằm ở C:\Windows\System32\ieframe.dll.

Khi tham chiếu được đặt, bạn sẽ có quyền truy cập vào thư viện được gọi là SHDocVw trong mã của bạn.

Bạn có thể lấy các cửa sổ IE (giả sử chỉ có một mở) bằng cách sử dụng sau đây (chưa được kiểm tra, điều chỉnh/giảm từ mã làm việc của riêng tôi):

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 

Trên đây cũng có thể được sửa đổi để cho phép một sự lựa chọn của nhiều cửa sổ IE đang mở.

+0

+ 1 Yup Nếu chỉ có một cửa sổ mở hoặc nếu Cửa sổ IE được xác định. –

+0

@SiddharthRout Tôi sử dụng loại tự động này hàng ngày và đã phát triển một số công cụ bẩn nhưng hiệu quả để hoàn thành việc này. (biểu mẫu liệt kê tất cả các cửa sổ có sẵn, lựa chọn người dùng, phiên sau đó liên kết với HWND, trong một số trường hợp đảm bảo cửa sổ vẫn mở, vv) – Gaffi

+0

Kool :) Bạn có thể muốn sửa đổi bài đăng của mình và thêm người dùng cần thêm tham chiếu đến Microsoft Internet Controls? –

2

Chết tiệt! Điều này nhắc tôi về vb6 ngày của tôi :)

Ok đây là những gì tôi có. Nếu có nhiều hơn 1 cửa sổ IE thì cửa sổ IE sẽ hoạt động lần cuối (hiện tại) nếu chỉ có một cửa sổ thì sẽ mất.

'~~> 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 

LƯU Ý: Tôi đã không thực hiện bất kỳ xử lý lỗi. Tôi chắc chắn bạn có thể chăm sóc điều đó;)

+0

Điều này khá khác so với phương pháp của tôi! Tôi sử dụng một số tham chiếu dll bên ngoài, nhưng chỉ để thao tác các trang (tức là nhảy qua lại giữa nhiều trang). Làm cách nào để bạn xử lý 'sw.Count = 1' khi cửa sổ duy nhất có đường dẫn không phải http, vì cửa sổ có thể là khung Windows chuẩn (tức là 'Máy tính của tôi')? – Gaffi

+0

Giống như tôi đã đề cập, tôi chưa bao gồm bất kỳ xử lý lỗi nào. sử dụng 'Left $ (ieOpenIEWindow.LocationURL, 4) = "http" 'giống như bạn đã làm sẽ là bước tiếp theo của tôi nhưng tôi đã thử nghiệm với 3 cửa sổ IE hợp lệ với địa chỉ thực. :) Cung cấp cho nó một thử với nhiều hơn 1 cửa sổ IE và xem những gì bạn nhận được URL? –

Các vấn đề liên quan