BreakPointMAN |
Отправлено: 01.06.2006, 17:24 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Получение текущего URL и текущего заголовка окна в браузерах. Насколько я понял, существует три основных способа решения данной задачи:
1) Извращения с окнами
Очень ненадежный метод, с которым даже не хочется связываться. Заключается в том, чтобы находить буквально "вручную" нужные окна с помощью WinAPI-функций FindWindow, GetWindow и пр., а затем получать необходимую информацию с помощью функции GetWindowText, посылки сообщения WM_GETTEXT и т.д. Зачастую нужно знать классы окон и их tab-последовательность, причем не факт, что ни то, ни другое не изменится в следующих версиях браузеров, да и что будет, например, если я возьму и сотру адрес из поля ввода?
2) DDE
Большинство браузеров являются DDE-серверами. Чтобы получить текущий URL, клиент должен установить соединение с сервером на тему (Topic) "WWW_GetWindowInfo" и выполнить запрос элемента данных (Item) "0xFFFFFFFF", результатом такого запроса будет строка c текущими адресом и заголовком окна:
QUOTE | "http://www.yandex.ru/","Яндекс","" |
Не очень удобно сделано, потому что потом эту строку еще нужно делить на составные части... Хорошо хоть, что они заключены в кавычки и разделены запятыми... но лучше, наверное, было бы, чтобы они передавались по-отдельности, или заключались в такие символы-разделители, которые не могут встретиться ни в адресе, ни в заголовке окна... Не знаю, могут ли встречаться кавычки и запятые в адресе, но в заголовке точно могут. Как отсюда корректно вырезать и то, и другое? Кстати, что за третья пустая строка, быть может, кто-нибудь знает? Она присутствует не всегда и не для всех браузеров...
Ну, а код на C++ Builder'е (в котором я пишу) будет выглядить примерно так:
CODE | DdeClientConv1->SetLink("IExplore","WWW_GetWindowInfo");
Edit1->Text = AnsiString(DdeClientConv1->RequestData("0xFFFFFFFF"));
DdeClientConv1->CloseLink(); |
Вместо "IExplore" может, например, быть "Firefox" или "Mozilla" или "Opera"...
Теперь достаточно кинуть на форму TDdeClientConv и TEdit и прописать где нужно, данный код.
3) COM
А вот здесь, пока, полный мрак... Хотелось бы разобраться с тем, как можно выполнять те же самые задачи с помощью COM-технологии. Какие из браузеров ее поддерживают? Как это можно реализовать на C++ Builder? Приветствуются любые ссылки по теме.
|
|
GIZMO |
Отправлено: 02.06.2006, 14:06 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (BreakPointMAN @ 01/06/2006, 17:24) | 3) COM
А вот здесь, пока, полный мрак... Хотелось бы разобраться с тем, как можно выполнять те же самые задачи с помощью COM-технологии. Какие из браузеров ее поддерживают? Как это можно реализовать на C++ Builder? Приветствуются любые ссылки по теме. |
IE(DHTML), FireFox(FireFoxACtiveX)
|
|
|