В хэлпе написано, что FindWindowEx в NT не пашет (

Тема в разделе "Delphi - Система", создана пользователем Guest, 23 окт 2004.

Статус темы:
Закрыта.
  1. Guest

    Guest Гость

    В хэлпе написано, что FindWindowEx в NT не пашет (Delphi6)
    Может в Delphi7 она пашет?

    Нашёл прогу по захвату url из Iexplorer'a.И вот она то и не пашет под XP,а в 98ой круто!
    Можно ли заставить это работать в XP? (оконный способ)

    Код (Text):
    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: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);
    end;
     
  2. zubr

    zubr Гость

    Guest

    Откуда ты взял, что FindWindowEx в NT не пашет?

    Чтобы твой код работал в NT, замени 'WorkerA' на 'WorkerW' (правда не будет работать в 98-ой):
    Код (Text):
    function GetURL:string;
    var
    ie,toolbar,combo,
    comboboxex,edit,
    worker,toolbarwindow:hwnd;
    begin
    ie := FindWindow(pchar('IEFrame'),nil);
    worker := FindWindowEx(ie,0,'WorkerW',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);
    end;
    А вот вариант кода не зависящего от системы:
    Код (Text):
    function GetURL_AllSystem:string;
    var
    ie, h:hwnd;
    buf:PChar;
    begin
    ie := FindWindow(pchar('IEFrame'),nil);
    buf:=StrAlloc(100);
    h:=GetWindow(ie, GW_CHILD);
    GetClassName(h, buf, 100);
    While h<>0 do
    begin
     If UpperCase(string(buf))=UpperCase('toolbarwindow32') then
     begin
      h:=GetWindow(h, GW_HWNDNEXT);
      GetClassName(h, buf, 100);
     end;
     If UpperCase(string(buf))=UpperCase('Edit') then
     begin
      result := GetText(h);
      StrDispose(buf);
      exit;
     end;
     h:=GetWindow(h, GW_CHILD);
     GetClassName(h, buf, 100);
    end;
    StrDispose(buf);
    Result:='';
    end;
     
  3. Barmutik

    Barmutik Гость

    Как варианты получения искомого системными способами:

    Через DDE:

    Код (Text):
    procedure TForm1.Button1Click(Sender: TObject);
    var
    DDE:TDdeClientConv;
    begin
    DDE:=TDdeClientConv.Create(self);
    if DDE.SetLink( 'IEExplore', 'WWW_GetWindowInfo' )then
    Edit1.Text:=DDE.RequestData('0xFFFFFFFF,sURL,sTitle')
    else
    ShowMessage('IEExplore is not running');
    DDE.Free;
    end;
    Через COM:

    Код (Text):
    procedure TForm1.Button1Click(Sender: TObject);
    var
    x: Integer;
    Sw: IShellWindows;
    begin
    sw := CoShellWindows.Create;
    for x := 0 to SW.Count - 1 do
     Listbox1.Items.Add((Sw.Item(x) as IWebbrowser2).LocationUrl);
    end;
     
  4. zubr

    zubr Гость

    Barmutik

    Здесь ошибка: вместо 'IEExplore' надо 'IExplore'. Как я понимаю, этим способом получить URL можно только с одного окна IExplore, а вот оконным методом можно со всех окон прочитать, к примеру:
    Код (Text):
    function GetURL_Allwindows(handl:hwnd):string;
    var
    h:hwnd;
    buf:PChar;
    begin
    buf:=StrAlloc(100);
    h:=GetWindow(handl, GW_CHILD);
    GetClassName(h, buf, 100);
    While h<>0 do
    begin
    If UpperCase(string(buf))=UpperCase('toolbarwindow32') then
    begin
     h:=GetWindow(h, GW_HWNDNEXT);
     GetClassName(h, buf, 100);
    end;
    If UpperCase(string(buf))=UpperCase('Edit') then
    begin
     result := GetText(h);
     StrDispose(buf);
     exit;
    end;
    h:=GetWindow(h, GW_CHILD);
    GetClassName(h, buf, 100);
    end;
    StrDispose(buf);
    Result:='';
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    h:hwnd;
    buf:PChar;
    begin
    Memo1.Lines.Clear;
    h:=Handle;
    buf:=StrAlloc(100);
    repeat
    h:=GetWindow(h, GW_HWNDNEXT);
    GetClassName(h, buf, 100);
    If h<>0 then
    begin
     If string(buf)='IEFrame' then
     Memo1.Lines.Add(GetURL_Allwindows(h));
    end
    else
    break;
    Until h=0;
    h:=Handle;
    repeat
    h:=GetWindow(h, GW_HWNDPREV);
    GetClassName(h, buf, 100);
    If h<>0 then
    begin
     If string(buf)='IEFrame' then
     Memo1.Lines.Add(GetURL_Allwindows(h));
    end
    else
    break;
    Until h=0;
    end;
    Какой здесь модуль надо подключить?
     
  5. Barmutik

    Barmutik Гость

    Угу в название ошибся... спасибо что поправили!

    Для чего конкретно какой модуль?
     
  6. Barmutik

    Barmutik Гость

    Да и в догонку вопрос:

    А если я возьму и сотру УРЛ после навигации в строке адреса?
    Или возьму и спрячу Тулбар с адресной строкой?

    Как Вы тогда УРЛ достанете? :)
     
  7. zubr

    zubr Гость

    Barmutik

    Я имею ввиду модуль для варианта через COM.
    Согласен, в оконном методе тоже есть недостатки.

    Вопрос немного не по теме. Если можно, подскажите где взять инфу по COM-интерфейсу IExplore.
     
  8. Barmutik

    Barmutik Гость

    IShellWindows - в shdocvw.pas

    Модуль: mshtml.pas - описаны большинство интерфейсов для работы с Internet Explorer

    Ну только интерфейс IWebBrowser... а IEXplore название для DDE сервера.
     
  9. zubr

    zubr Гость

    Barmutik

    Спасибо.
    Еще вопрос: где взять инфу по DDE серверам, типа Word, Excel, IExplore и т. д., я имею ввиду имя сервера, темы (типа WWW_GetWindowInfo).
     
  10. Barmutik

    Barmutik Гость

    Встречный вопрос:

    А зачем про DDE информацию? Почему не через COM ? Проще и современнее...
     
  11. zubr

    zubr Гость

    Barmutik

    Для общего развития :)
     
  12. Barmutik

    Barmutik Гость

    Ну если только .. DDE - устаревшая технология, поддерживается только для backward compability :rolleyes:

    Поищи в MSDN ... хотя что плохо так это что у каждой версии будет своя инфа.. Через COM удобнее в плане уверенности что всегда будет работать...
     
  13. zubr

    zubr Гость

    Barmutik

    Спасибо.
     
Статус темы:
Закрыта.

Поделиться этой страницей