Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Доступ к ативному окну IE


Автор: jonimimoni 11.3.2011, 11:21
Доброго времени суток.
Прошу помощи в решении проблемы определения активного окна IExplorer и изъятия из него URLа.
ТЕХЗАДАНИЕ: 
 - программа свёрнута и реагирует на нажатие F12(использую хуки, эта часть работает);
 - дополнительно открыто n-ое число (5-20) окон IExplorer6 (без вкладок, одно окно - один URL), одно из них активно;
 - требуется по нажатию F12 получить доступ именно к !!!активному окну!!! и извлечь из него URL, после закрыть это окно, таким образом следующее становиться активным;
 - нажимать кнопку пока не закончатся окна IExplorer6;

Использовал готовую функцию:
Код

function Get_URL : string;
var
Cliente_DDE: TDDEClientConv;
temp: PChar;      //<<-------------------------This is new
begin
Result := '';
Cliente_DDE:= TDDEClientConv.Create( nil );
with Cliente_DDE do
begin
   SetLink( 'IExplore','WWW_GetWindowInfo');
   temp := RequestData('0xFFFFFFFF');
   Result := StrPas(temp);
   StrDispose(temp);  // <<-- Предотвращаем утечку памяти
   CloseLink;
end;
Cliente_DDE.Free;
end;

но когда открыто больше одного IExplore, данная функция перестаёт работать.
Интуитивно догадываюсь, что необходимо получать дескриптор\хендл или что ещё активного окна IExplore и с ним уже работать, но и функция будет другая и метод обработки.
Так же понимаю что ответ скрыт http://forum.vingrad.ru/topic-110766.html, но знаний моих не хватает чтобы это осилить.
В связи с вышесказанным прошу помощи в разъяснении или ссылками, а за готовый код буду очень признателен.

Автор: Rrader 11.3.2011, 19:27
Цитата(jonimimoni @  11.3.2011,  17:21 Найти цитируемый пост)
требуется по нажатию F12 получить доступ именно к !!!активному окну!!! и извлечь из него URL

Попробуй GetForegroundWindow и проверь, что окно - действительно от IE (класс окна должен быть IEFrame). Зная хэндл, текст можно вытянуть через http://wmsdk.com/2009/07/09/directui-iaccessible/

Автор: jonimimoni 12.3.2011, 00:48
Спасибо Rrader за Ваш ответ smile 
Цитата(Rrader)
Попробуй GetForegroundWindow и проверь, что окно - действительно от IE (класс окна должен быть IEFrame).
 сделал, работает... может быть бестолково и не правильно, но на практике работает так как надо, код ниже
Код

procedure GetURLActive;
var WND : HWND;
begin
   WND := FindWindow('IEFrame', nil);            // найти любое окно IE
   if WND <> 0 then                                         // если оно есть
     begin
       SetForegroundWindow(WND);                 // сделать его активным
            $$$
       PostMessage (WND, WM_CLOSE, 0, 0);   // закрыть активное окно IE
     end else showmessage('Окна кончились');
end;


Теперь вторая часть марлизонского балета, на месте $$$ должен быть код по вытягиванию URL, но...
Цитата(Rrader)
Зная хэндл, текст можно вытянуть через IAccessible 

с этим засада, поскольку при компиляции (http://wmsdk.com/2009/07/09/directui-iaccessible/ есть готовый проект, призванный помочь понять IAccessible) возникла ошибка, отсутствует OLEACC.DCU Скачать в инете не получилось smile 
Было принято решение не использовать IAccessible а погуглить-пояндексить-подркбить и всего 2 достойных варианта: первый изложен в первом посте, а вот второй
Код

function GetURL: string;
var
ie, toolbar, combo, comboboxex, edit, worker, toolbarwindow: hwnd;
begin
ie := FindWindow(pchar('IEFrame'), nil);
worker := FindWindowEx(ie, 0, 'WorkerA', nil);
toolbar := FindWindowEx(worker, 0, 'rebarwindow32', nil);
comboboxex := FindWindowEx(toolbar, 0, 'comboboxex32', nil);
combo := FindWindowEx(comboboxex, 0, 'ComboBox', nil);
edit := FindWindowEx(combo, 0, 'Edit', nil);
toolbarwindow := FindWindowEx(comboboxex, 0, 'toolbarwindow32', nil);
result := GetText(edit);
 оказался на деле НЕРАБОЧИМ... т.е. значение функции пустое, или отсутствует или ещё чего. (знаю, это разные значения)
В связи с этим просьба, помочь в написании фрагмента кода для получения URL из окошка с хендлом WND smile 
Заранее спасибо.

Автор: Rrader 12.3.2011, 11:51
Цитата(jonimimoni @  12.3.2011,  06:48 Найти цитируемый пост)
 сделал, работает... может быть бестолково и не правильно, но на практике работает так как надо, код ниже

Так ведь вопрос был в том, как получить активное окно, а не установить его?
Цитата(jonimimoni @  12.3.2011,  06:48 Найти цитируемый пост)
с этим засада, поскольку при компиляции (там есть готовый проект, призванный помочь понять IAccessible) возникла ошибка, отсутствует OLEACC.DCU Скачать в инете не получилось smile 

Прикрепил к посту

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