2012-06-22 19 views
6

Internet Explorer nesnesinde Visual Basic'te çalışıyorum. IE'nin görüntülediği mevcut URL'yi kopyalamanın bir yolu var mı? Bu yüzden panoya başka bir yere yapıştırabilir miyim?IE'de Geçerli URL'yi Kullanma Visual Basic'i Kullanma

+0

bu sizin istediğinizden biraz daha karmaşık olabilir ve VB.NET'dir, ancak çevrilebilir olmalıdır. Umarım [URL Al] yardımcı olur (http://www.codeproject.com/Articles/204929/Getting-current-browser-URL-with-VB-NET) –

+0

Hangi uygulama? Excel, Erişim ..? – Fionnuala

+0

Güncel IE ile nasıl bağlantı kurdunuz? Bu, açık olan 1 IE penceresinden daha fazlası varsa önemlidir. Altyazıya dayanarak IE ile bağlanıyor musunuz? Bize daha fazla kod gösterme aslında yardımcı olacaktır. Kodun tüm IE pencerelerinden URL almasını istiyorsanız, Microsoft Internet Controls için bir referans belirleyebilir ve daha sonra 'ShellWindows' kullanarak tüm IE pencereleri arasında geçiş yapabilirsiniz. Pencereyi aldıktan sonra, adresi almak için '.LocationURL' kullanmanız yeterlidir. –

cevap

6

kendisi biraz daha karmaşık olan, zaten IE penceresi belirledik varsayarsak - Ben yapabilirsiniz gerekirse bu konuda ayrıntılı:

Dim ieIEWindow As SHDocVw.InternetExplorer 
Dim sIEURL As String 

'Set your IE Window 

sIEURL = ieIEWindow.LocationURL 

IE penceresi almak için, başvuru gerekir Tools =>References...'a gidip listeden seçerek VBA düzenleyicisinde Microsoft Internet Controls kitaplığı (ieframe.dll). Bu öğe mevcut değilse, benim için .dll dosyası C:\Windows\System32\ieframe.dll adresinde bulunur.

Referans ayarlandıktan sonra, kodunuzdaki SHDocVw kitaplığına erişebilirsiniz. Bir seçilmesine olanak sağlamak için

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 

yukarıda da değiştirilebilir:

Sen (denenmemiş, modifiye/Kendi çalışma kodundan azaltılmış) Aşağıdaki kullanarak (sadece bir açık varsayarak) IE pencereyi tutup çoklu açık IE pencereleri.

+0

+ 1 Yup Sadece bir pencere açıksa veya IE Penceresi tanımlanmışsa. –

+0

@SiddharthRout Bu tür bir otomasyonu günlük olarak kullanıyorum ve bunu başarmak için kirli ama etkili araçlar geliştirdim. (kullanılabilir tüm pencereleri listeler, kullanıcı seçer, oturum daha sonra HWND'ye bağlanır, bazı durumlarda pencerenin hala açık olmasını sağlar, vb.) – Gaffi

+0

Kool :) Gönderinizi değiştirmek ve kullanıcının eklemesi gerektiğini eklemek isteyebilirsiniz Microsoft ınternet denetimleri başvuru? –

2

Lanet! Bu benim vb6 gün hatırlatıyor :)

Tamam bende var. Eğer 1 IE'den daha fazla pencere varsa, o zaman sadece bir pencere varsa, o zaman bunu alacak olan son aktif (Current) IE penceresini alacaktır.

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

NOT: Ben herhangi bir hata işleme yapmadım. Bununla ilgilenebileceğinizden emin olabilirsiniz;)

+0

Bu, yöntemlerimden biraz farklı! Bazı harici dll referanslarını kullanıyorum, fakat sadece sayfaları manipüle etmek (yani, çoklu ve geri arasında atlamak). Pencerenin standart bir Windows çerçevesi (yani, Bilgisayarım) olabileceğinden, tek pencerenin http olmayan bir yolu olduğu zaman, sw.Count = 1 'i nasıl ele alırsınız? – Gaffi

+0

Bahsettiğim gibi herhangi bir hata işleme dahil etmedim. 'Sol $ (ieOpenIEWindow.LocationURL, 4) = "http" 'yaptığınız gibi bir sonraki adımı olurdu ama gerçek adresleri ile 3 geçerli IE penceresiyle test ediyordum. :) 1 IE penceresinden daha fazlasını deneyin ve hangi URL'yi görüyorsunuz? –