Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Получение текущего URL из браузера


Автор: VictorGr 20.7.2007, 17:44
ЗДРАВСТВУЙТЕ!

У меня вопрос такой:

можно ли мне программой (на VB6) получить текущий адрес (URL) открытой страницы в браузере?

Честно говоря, желательно найти приёмы для всех браузеров  (IE6-7, Firefox, Opera, Safari...).

Такое возможно? smile Хотя бы в каком направлении смотреть?

Спасибо smile

Автор: bartram 20.7.2007, 17:47

M
bartram
Перемещена из MS Windows

Автор: Akina 20.7.2007, 19:08
Любой браузер имеет СОМ-интерфейс. Получив PID экземпляра браузера, можно запросить требуемую информацию.

VB6 не имеет штатных средств для выполнения поставленной задачи - это проблема, решаемая на уровне API.

Автор: bom 21.7.2007, 13:22
Пример для всех окон IE:
Код

    Dim Shell1, ShellWindows, IE, url As String
    Set Shell1 = CreateObject("Shell.Application")
    Set ShellWindows = Shell1.Windows
    Set IE = CreateObject("InternetExplorer.Application")
    
    For Each IE In ShellWindows
        If LCase(TypeName(IE.document)) = "htmldocument" Then url = url & IE.LocationURL & vbCr
    Next
    
    If Len(url) Then MsgBox url Else MsgBox "Nothing found"
    Set Shell1 = Nothing
    Set ShellWindows = Nothing
    Set IE = Nothing

Автор: Akina 22.7.2007, 18:35
bom, красиво.

А не валится, если у Shell.Application.Windows(i) нет свойства document?

Автор: VictorGr 22.7.2007, 19:06
bom, класс! Работает, спасибо!

А на FF, Opera такое сработает?


Akina, ещё слышал о DDE. Оно вообще встроено прямо в VB.
http://community.livejournal.com/ru_programming/799908.html?

Для IE удалось получать URL, но только последнего (самого правого на панели задач) окна.

Автор: Akina 22.7.2007, 19:25
Цитата(VictorGr @  22.7.2007,  20:06 Найти цитируемый пост)
слышал о DDE. Оно вообще встроено прямо в VB.

Вообще-то это одна из технологий взаимодействия - динамический обмен данными,- встроена в операционную систему и к какому-либо отдельному языку программирования никакого отношения не имеет. Как, впрочем, и СОМ...

Автор: bom 22.7.2007, 22:24
Цитата(Akina @  22.7.2007,  21:35 Найти цитируемый пост)
не валится, если у Shell.Application.Windows(i) нет свойства document?

Не пробовал перебирать все окна подряд.  У InternetExplorer.Application это св-во имеется, но можно и подстраховаться, организовав обработчик ошибок, если что.

Цитата(VictorGr @  22.7.2007,  22:06 Найти цитируемый пост)
А на FF, Opera такое сработает?

Вряд ли. Как сказал Akina,  у каждого браузера свой интерфейс взаимодействия.

Цитата(VictorGr @  22.7.2007,  22:06 Найти цитируемый пост)
Для IE удалось получать URL, но только последнего (самого правого на панели задач) окна.

Покажи код.

Автор: VictorGr 23.7.2007, 22:34
Код

    On Error GoTo errorhandler

      label1.LinkTopic = "IExplore|WWW_GetWindowInfo"
      label1.LinkItem = "0xffffffff"
      label1.LinkMode = 2
      label1.LinkRequest

    errorhandler:
        Resume Next


Вот такой код. Получает URL самого крайнего IE.

Автор: bom 24.7.2007, 02:28
Про DDE не знаю, поищи в MSDN

Автор: VictorGr 24.7.2007, 02:42
bom, искал...

А вопрос о COM: можно ли получить объект IE (как Вы указали выше) по его HWND или по номеру процесса? Ваш способ работает на отлично, но, он достаточно "тяжёлый" для моей программы: довольно заметно, как программа притормаживает.

А мне бы было достаточно получать URL активного в текущий момент окна. (Чьё hwnd и номер процесса я знаю) smile.

Искал в интернете... Но Гугль -- такая штука smile Он фразу поиска, где есть литеры "COM" не воспринимает smile.

Автор: bom 24.7.2007, 17:59
Если HWND родительского окна известен, можно получить текст дочернего достаточно легко с помощью API:

Код

'В форме - Label1:

Private Sub Form_Load()
Call EnumChildWindows(HWND, AddressOf WndEnumChildProc, Label1)
End Sub


'В модуле:

Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function EnumChildWindows Lib "user32" (ByVal hwndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Any) As Long
Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE

Function WndEnumChildProc(ByVal hwnd As Long, ByVal lb As Label) As Long
Dim ClName As String * 50
GetClassName hwnd, ClName, 50
If InStr(LCase(ClName), "comboboxex32") Then lb = GetText(hwnd)
WndEnumChildProc = 1
End Function

Private Function GetText(hwnd As Long) As String
Dim Text As String * 1024
Call SendMessage(hwnd, WM_GETTEXT, 1024, ByVal Text)
GetText = Text
End Function

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)