Przechwycenie adresu URL z przeglądarki w Lazarusie

0

Witam, pisząc program napotkałem się na pewien problem. Próbuję przechwycić adres wpisany w przeglądarce (IE, Firefox, Opera). Na borlandowym Delphi mogłem zrobić to przy użyciu ddeman, którego brakuje mi na lazarusie. Jakiego komponentu lub jakich funkcji mogę w tym celu użyć w lazarusie?

0

Jakiego komponentu lub jakich funkcji mogę w tym celu użyć w lazarusie?

Użyj czystego WinApi.

0

Wpłynąłem na nieznane wody.. Miałbyś może przykład użycia WinApi w celu zdobycia adresu z przeglądarki? Albo może jest inny sposób na zdobycie takiego adresu?

1

To trochę toporne bo musi być inny kod dla każdej przeglądarki np. dla IE (sprawdzone na wersji 8):

const
  CHILD_CONTROLS_CLASS: array [0..3] of string = ('WorkerW', 'ReBarWindow32',
    'Address Band Root', 'Edit');
var
  hWin: THandle;
  i: Integer;
  buff: array [0..MAX_PATH] of Char;
begin
  hWin:= FindWindow('IEFrame', nil);
  i:= Low(CHILD_CONTROLS_CLASS);
  while (hWin > 0) and (i <= High(CHILD_CONTROLS_CLASS)) do
  begin
    hWin:= FindWindowEx(hWin, 0, PAnsiChar(CHILD_CONTROLS_CLASS[i]), nil);
    Inc(i);
  end;
  if hWin > 0 then
  begin
    SendMessage(hWin, WM_GETTEXT, MAX_PATH, Integer(@buff));
    ShowMessage(StrPas(buff));
  end;
end;
0

To trochę toporne bo musi być inny kod dla każdej przeglądarki np. dla IE (sprawdzone na wersji 8):

Nie kłam, nie musi być inne... Gdybym ja to miał pisać to bym założył hooka na wysyłanie HTTP requestów jeżeli bym nic łatwiejszego nie znalazł... Ale zapewne jest jakaś zunifikowana droga, trzeba poczytać na necie...

0

(zanim przeglądarka wyśle request)

A dlaczemu mam to robić zanim przeglądarka wyśle request? Dla mnie to dosyć logiczne że najpierw się wpisuje adres, wciska się enter i wtedy go łapiemy, nie widzę sensu łapania tekstu który np. jest jeszcze nie do końca wpisany, ty widzisz?

1
-123oho napisał(a):

A dlaczemu mam to robić zanim przeglądarka wyśle request?

A czemu nie czytasz ze zrozumieniem on próbuje przechwycić adres wpisany a nie wysłany gdzie napisał że chce przechwycić adresy przeglądanych stron? Sensu za bardzo nie widzę ale odpowiadam na temat i nie wnikam po co mu to :P

0

A czemu nie czytasz ze zrozumieniem

Problem wielu osób na tym forum polega na tym że nie wiedzą co chcą osiągnąć (np. dlatemu nie umieją zadać pytania). Ja koryguje ich błędy.

on próbuje przechwycić adres wpisany a nie wysłany gdzie napisał że chce przechwycić adresy przeglądanych stron?

To jak ja chcę coś wypisać na ekranie to polecisz mi marker czy instrukcję writeln?
Czepiasz się. Moje rozwiązanie jest również warte świeczki (kto dzisiaj używa IE?!), szukasz dziury w całym.

0

Dziękuję za odpowiedzi, na IE działa, jeśli chodzi o firefoxa i operę, to nie wiem czy dobrze myślę, jest to kwestia zmiany w linii " hWin:= FindWindow('IEFrame', nil); "? Jak będzie dla firefoxa i jak dla opery? Kombinuję na różne sposoby i nawet nie wiem czy myślę w dobrą stronę..

edit: ewentualnie czy tutaj da mi coś to, że znam tytuł okna? Bo mam taką funkcję i działa. Sory za banalne pytania ale dla mnie banalne nie są, dopiero zaczynam z uchwytami

0

jest to kwestia zmiany w linii " hWin:= FindWindow('IEFrame', nil); "

Nie tylko. Widać to jak się rozumie kod gdy dają gotowce... Najpierw musisz zrozumieć co ten kod robi, a to już pewnie jest dla ciebie zbyt trudne, więc czemu my w ogóle gadamy o czymś takim jak pobieranie adresów z adressbara o_O.

ewentualnie czy tutaj da mi coś to, że znam tytuł okna?

To że znasz tytuł okna da ci to że znasz tytuł okna. Tylko co z tego?

Widzę że zamiast iść w stronę unifikacji idziesz w stronę ograniczenia się do paru przeglądarek bez żadnej gwarancji że w przyszłości to będzie działać. Moim zdaniem głupie.

0

Właściwie mnie tylko te trzy przeglądarki interesują, na IE działa jak powinno, gdyby ktoś mógł przerobić kod pod firefoxa i operę byłbym dźwięczny.

Prawdopodobnie przyda mi się program WinDowse, ale nie za bardzo wiem jak do tego podejść. Proszę o jakieś wskazówki.

1

gdyby ktoś mógł przerobić kod pod firefoxa i operę byłbym dźwięczny.

Kto chce się przekonać co znaczy być dźwięcznym niech pisze kody!
Czyli liczysz że za ciebie odwalimy całą robotę? No cóż, głupie to, ale i tak nic lepszego nie zrobisz bo widać że rzucasz się bez wiedzy na coś czego de facto nie umiesz zaprogramować, tylko my umiemy.

Proszę o jakieś wskazówki.

Wskazówka: Wytłumacz dokładnie o co chodzi. Niestety nie wszyscy na forum siedzą z zapartym tchem szukając informacji o twoim problemie i wyczekując aż odpowiesz. Pamiętaj: To tobie zależy, nie nam.

0

Nie liczę że cały program napiszecie za mnie, liczę na pomoc w napisaniu funkcji która będzie działała analogicznie do funkcji którą umieścił kAzek. Za pomocą programu WinDowse mogę odczytać klasy, tutaj prawdopodobnie będzie to MozillaWindowClass przy firefoxie (WinDowse wskazuje tą klasę w miejscu w którym wskazywał w IE na klasę "IEFrame". Czyli analogicznie

   hWin:= FindWindow('MozillaWindowClass', nil);  

Gdzie jeszcze powinienem dopatrywać się zmian w kodzie?

0

Nie liczę że cały program napiszecie za mnie, liczę na pomoc w napisaniu funkcji która będzie działała analogicznie do funkcji którą umieścił kAzek.

Coś w stylu: Nie liczę że napiszecie za mnie cały program! Poustawiałem guziczki!

Za pomocą programu WinDowse mogę odczytać klasy, tutaj prawdopodobnie będzie to MozillaWindowClass przy firefoxie (WinDowse wskazuje tą klasę w miejscu w którym wskazywał w IE na klasę "IEFrame".

Brawo, tyle już masz. Chociaż tyle, bo co prawda do rozwiązania ci jeszcze sporo brakuje.

Gdzie jeszcze powinienem dopatrywać się zmian w kodzie?

Pomiędzy linią pierwszą a ostatnią. Doprawdy, kod jest taki krótki, że skoro nie wiesz co trzeba zmodyfikować to znaczy że po prostu nie rozumiesz jak on działa... Zrozum zasadę działania to reszta przyjdzie bez problemu.

Widzę że się starasz coś zrobić i pokazać że nie leniuchujesz, więc bardzo krótko ci wyjaśnię jak to działa:
1.Pobiera klasę głównego okna (to właśnie zmodyfikowałeś)
2.Szuka Edita poprzez wyszukiwanie kolejne dzieci komponentów (tego nie zmodyfikowałeś)
3.Pobiera jego zawartość lub wywala error jeżeli nie znalazł.

Czyli musisz zmodyfikować też kolejne subkomponenty do których będziesz skakać. Pogoogluj, może znajdziesz coś co wyświetla wszystkie subkomponenty wszystkich okien to ogarniesz to (nie wiem czy ten program co pobrałeś to ma).

Na więcej pomocy z mojej strony nie licz, w każdym razie jeżeli będziesz tak sprytny jak dotychczas to ogarnięcie tego nie powinno tobie sprawić problemów.

0

@nuke: ech, leniuchu. Doradzili Tobie dobrze poprzednicy jak kombinowac z DDE. Nie wiem czy pod Lazarusem nie będzie problemów, ale co to za kłopot znaleźć i pobrać sobie wersje Enterprise na przykład Delphi 7 i ze źródeł modułów w podkatalogu instalacji SOURCE wyodrebnić z ddeman.pas ewentualnie ddeml.pas i jeszcze sysutils.pas dla kodów funkcji tam zawartych, a używanych przez oryginalne VCL'owe ddeman i stworzyć coś, co będzie działało w czystym WinAPI. Wystarczy tylko chcieć. Dobra, bo już miałem taki moduł jak pisałem sobie w WinAPI wtyczkę do AQQ dla testów, która powodowała, że teksty z aktywnego okna rozmowy czytał głos Expressivo - poprawić, co też zrobiłem i dodałem funkcję RequestData, która w poniższym kodzie oryginalnie z użyciem TDDEClient pod VCL jest dostępna na mnóstwie stron z przykładowymi kodami do wygooglowania. Dodam, że pod Delphi 7 Personal działa ok dla Opery oczywiście. Pod Lazarusem nie powinno również sprawiać problemów, ale za Lazarusa nie ręcżę, bo go nie używam, jeżeli coś nie działa to pokombinuj dalej sam. Na przyszłość tak doradzam jeżeli chce się z pod VCL skorzystać z niektórych udogodnień pod WinAPI. Najlepiej Total Commander do wyszukiwania fraz w modułach, jakiś edytor [ja z przyzwyczajenie używam tego wbudowanego w FAR'a], trochę copy + paste do ososbnego modułu i mamy kod, który można śmiało wykorzystać dla WinAPI. Są wyjątki, gdzie do przeniesienia kodu jest za dużo, ale w przypadku na przykład ShellApi, ShlObj, właśnie DDEMan czy własnej obsługi Open/Save dialogu pod WinAPI nie jest to żadnym problemem, ot wystarczą tylko chęci :)

//...
uses
  minidde;

function GetActiveURL(Service : string) : string;
var
  Temp : PChar;
begin
  Result := '';
  SetLink(Service, 'WWW_GetWindowInfo');
  Temp := RequestData('0xFFFFFFFF');
  Result := Temp;
end;

procedure TForm1.FormCreate(Sender : TObject);
begin
  ShowMessage(GetActiveURL('Opera'));
end;
//..

1 użytkowników online, w tym zalogowanych: 0, gości: 1