Vitalonic - исходники  
главная >> исходники >> ответы на вопросы последнее обновление 19.02.04

Ссылки   Вопросы  

Написать мне письмо

Гостевая книга

Пожалуйста, учтите, что приводимый код написан под библиотеку KOL и, как правило, не может быть использован в стандартных программах Delphi (т.е. программ под VCL) без некоторой переделки (подробнее об этом на главной странице). Все ссылки на первоисточники по возможности сохранены.

  Как получить URL из адресной строки Internet Explorer?



Ответы
Как получить URL из адресной строки Internet Explorer?

В интернете описано как минимум два способа захвата адреса (URL) из адресной строки активного окна броузера. Первый - через DDE, о нем можно почитать здесь. Такой способ универсален и подходит как к IE так и к Netscape, но требует подключения сомнительной (в смысле, устаревающей) библиотеки DDEMan. Второй способ, который я опишу подробнее, заключается в прямом получении текста из адресной строки путем посылания соответствующему контролу сообщения WM_GETTEXT. Итак, идеология такова: находим хэндл окна эксплорера, находим дочернее окно (адресную строку) и спокойно считываем из него URL. Но здесь есть тонкость: в разных операционных системах (имеется в виду семейство NT (2000, XP) и 95/98/ME) классы дочерних окон называются по-разному. Поэтому то, что работает под windows 98, не будет работать под windows 2000 и наоборот. Таким образом, задача усложняется: вначале надо определить версию windows, и в зависимости от результата использовать разные функции. Попытка написать универсальную функцию привела к следующему коду:

Var W2k:boolean; //должна быть true, если установлены WinNT, Win2xxx или WinXP

function GetText(WindowHandle: hwnd):string;
//вспомогательная функция для получения текста окна
var
  txtLength : integer;
  buffer: string;
begin
  TxtLength := SendMessage(WindowHandle, WM_GETTEXTLENGTH, 0, 0);
  txtlength := txtlength + 1;
  setlength (buffer, txtlength);
  sendmessage (WindowHandle,wm_gettext, txtlength, longint(@buffer[1]));
  result := buffer;
end;

function GetURL(ie:hWnd):string;
var
  toolbar,comboboxex,worker,toolbarwindow:hwnd;
begin
  //различие названий класов дочернего окна "worker"
  //в разных операционных системах учитываем здесь
  if W2k then worker := FindWindowEx(ie,0,'WorkerW',nil)
  else worker := FindWindowEx(ie,0,'WorkerA',nil);
  //вообще, надо было бы писать так:
  //if worker>0 then toolbar:=... и т.д., но мы уберем проверки:
  toolbar := FindWindowEx(worker,0,'rebarwindow32',nil);
  comboboxex := FindWindowEx(toolbar, 0, 'comboboxex32', nil);
  result := GetText(comboboxex);
end;

Считывание текста оформлено в виде отдельной функции GetText, которая бывает нужна довольно часто, если Вы работаете с посторонними окнами. Таким образом, нужно определить версию виндов (в KOL для этого есть функция WinVer) и присвоить соответствующее значение переменной W2k, а затем вызвать функцию GetURL, передав ей в качестве параметра хэндл окна эксплорера. Способ работает для всех (не только активных и верхних окон). Исходник программы, демонстрирующий все описанное, лежит здесь

  наверх


Copyright © 2002-2004 Vitalonic
Hosted by uCoz