Я разрабатываю простую надстройку для Internet Explorer и пытаюсь получить текущий URL-адрес адресной строки IE 8, используя серию (пример) HWND handle = FindWindowEx(parent_handle,0,"AddressDisplay Control",NULL);
в следующем порядке:
1- IEFrame
2- WorkerW
3- ReBarWindow32
4- Address Band Root
5- Edit
5- (alternatively) AddressDisplay Control
Я определил эту серию элементов управления с помощью winspy++ 1.6.
Код, который я пытаюсь получить текущий URL-адрес:
TCHAR currentURL[255];
::GetWindowText(handle_to_the_Edit_or_AddressDisplay_control, currentURL, 255);
Однако он ничего не устанавливает в массив currentURL.
Этот метод с немного измененными именами и последовательностями элементов управления работал в более ранних версиях IE, я мог легко получить текущий URL-адрес, но для IE 8 я не смог его получить.
Что я должен делать? Спасибо
Примечание. Я просмотрел много страниц и сообщений. Неудачно.
Проблема не связана с какими-либо вопросами безопасности. Это просто упражнение по программированию.
См. блог OldNewThing: "Большая маленькая программа: Мониторинг окон Internet Explorer и Explorer, часть 1: Перечисление"
@ zett42 спасибо за предложение. Это правильный способ получить URL-адрес в IE, но он использует стек COM/ATL и поэтому не так практичен. Я пытался добавить функцию GetBrowserInfo в статью, но один из необходимых файлов заголовков atlalloc.h был недоступен в моей среде VC++ 6 и VC++2010 Express.
Что за дополнение именно? Если это BHO (объект помощника браузера), то он имеет прямой доступ к интерфейсу браузера IWebBrowser2 и может просто запросить его текущий URL-адрес, не прибегая к вообще доступу к элементам управления пользовательского интерфейса.
@RemyLebeau Он извлекает текущий URL-адрес и манипулирует некоторой его частью для облегчения навигации; так это БХО. Я попробовал использовать свойство IWebBrowser2 (или метод?) get_LocationURL следующим образом: char strCurURL[255];HRESULT temp = m_pBrowser->get_LocationURL((BSTR*) strCurURL);::SendMessage(hMyEditControl,WM_SETTEXT,0,(long)strCurURL); Но strCurURL отображается неправильно. Как это устроить? hMyEditControl — это обычный элемент управления Edit.
@ Ромарио, ты не можешь преобразовать буфер TCHAR[] в такой BSTR*. get_LocationURL() выделяет и возвращает новый BSTR, вам нужно копировать/конвертировать эту строку в буфер по мере необходимости, а затем освободить BSTR, когда закончите. BSTR bstrURL; HRESULT temp = m_pBrowser->get_LocationURL(&bstrURL); /* use bstrURL as needed ... */ SysFreeString(bstrURL); Если ваш элемент управления Edit представляет собой окно Unicode, вам вообще не нужен буфер: BSTR bstrURL; HRESULT temp = m_pBrowser->get_LocationURL(&bstrURL); SendMessage(hMyEditControl, WM_SETTEXT, 0, (LPARAM)bstrURL); SysFreeString(bstrURL);
@RemyLebeau Такое преобразование: char *p = _com_util::ConvertBSTRToString(bstrURL); проблема решена ::SendMessage(hMyEditControl,WM_SETTEXT,0,(long)p); теперь отображается правильно. Это также считается принятым ответом, так что спасибо, но не могли бы вы еще прокомментировать причины, по которым нельзя получить этот URL-адрес из элементов управления пользовательского интерфейса? Особенно когда это возможно сделать в IE 7?
@Romario Потому что это неправильный способ сделать это даже в IE7. То, что это мог сделано таким образом, не означает, что это должен должно быть сделано таким образом. Существует причина, по которой BHO имеет прямой доступ к базовому объекту WebBrowser, BHO не должен полагаться на какое-либо конкретное представление пользовательского интерфейса объекта WebBrowser.





После применения предложения @Remy Lebeau char *p = _com_util::ConvertBSTRToString(bstrURL);::SendMessage(hMyEditControl,WM_SETTEXT,0,(long)p); стало отображаться правильно.
И это объясняет, почему способ IE 7 для получения URL-адреса из элементов управления пользовательского интерфейса не работает в IE 8:
Because that is not the right way to do it, even in IE7.
Just because it could be done that way does not mean it should be done that way.
There is a reason why a BHO has direct access to the underlying WebBrowser object,
the BHO should not rely on any particular UI representation of the WebBrowser object.
Так что это принятый ответ.
Я чувствую запах вредоносного ПО. Надеюсь, у вас установлено антивирусное решение во время разработки. :П