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

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

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

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

Код:
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;
 
Z

zubr

#2
Guest

В хэлпе написано, что FindWindowEx в NT не пашет (Delphi6)
Может в Delphi7 она пашет?
Откуда ты взял, что FindWindowEx в NT не пашет?

Чтобы твой код работал в NT, замени 'WorkerA' на 'WorkerW' (правда не будет работать в 98-ой):
Код:
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;
А вот вариант кода не зависящего от системы:
Код:
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;
 
B

Barmutik

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

Через DDE:

Код:
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:

Код:
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;
 
Z

zubr

#4
Barmutik

Через DDE:


Код

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;
Здесь ошибка: вместо 'IEExplore' надо 'IExplore'. Как я понимаю, этим способом получить URL можно только с одного окна IExplore, а вот оконным методом можно со всех окон прочитать, к примеру:
Код:
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;
Через COM:


Код

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;
Какой здесь модуль надо подключить?
 
B

Barmutik

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

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

Barmutik

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

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

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

zubr

#7
Barmutik

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

Как Вы тогда УРЛ достанете? :)
Согласен, в оконном методе тоже есть недостатки.

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

Barmutik

#8
IShellWindows - в shdocvw.pas

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

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

zubr

#9
Barmutik

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

Barmutik

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

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

Barmutik

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

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