| Vitalonic - исходники |   |
главная >> исходники >> ответы на вопросы | последнее обновление 19.02.04 |
Ссылки |   | Вопросы |   |
Написать мне письмо Гостевая книга |
Пожалуйста, учтите, что приводимый код написан под библиотеку KOL и, как правило, не может быть использован в стандартных программах Delphi (т.е. программ под VCL) без некоторой переделки (подробнее об этом на главной странице). Все ссылки на первоисточники по возможности сохранены.
|
Ответы |
В интернете описано как минимум два способа захвата адреса (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, передав ей в качестве параметра хэндл окна эксплорера. Способ работает для всех (не только активных и верхних окон). Исходник программы, демонстрирующий все описанное, лежит здесь
наверх