Przechwytywanie adresów WWW

dział ogólny

Przechwytywanie adresów WWW

Nowy postprzez husky83 » poniedziałek, 21 grudnia 2009, 12:53

Hejka :)

Mam pytanie..
Chciałbym, przechwytywać adres strony niezależnie od przeglądarki - czy to będzie Firefox, IE, chrom, opera czy jeszcze inny wynalazek. A jeśli aż tak się nie da (lub jest to zbyt trudne) - przynajmniej z firefoxa i IE :)
Jest jakiś w miarę prosty sposób?
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
Podziękował : 2
Otrzymał podziękowań: 0
Kompilator: C++ Builder
    NieznanyNieznana

Re: Przechwytywanie adresów WWW

Nowy postprzez Cyfrowy Baron » poniedziałek, 21 grudnia 2009, 13:26

► patrz serwis: Cyfrowy Baron dział: porady -> sieć - internet -> Pobieranie adresu z aktywnego okna przeglądarki.

jest to przykład dla IE, kluczem jest "iexplore"

Kod: Zaznacz cały
Adres->SetLink("iexplore", "WWW_GetWindowInfo");


klucze dla innych przeglądarek:

   Netscape
   Mosaic
   Netscp
   Mozilla
   Firefox

Funkcja SetLink zwraca wartość true jeżeli adres został odnaleziony, więc mozna to wykorzystać do sprawdzania wielu przeglądarek:

Kod: Zaznacz cały
#include <winsock.h> // należy włączyc tą bibliotekę

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TDdeClientConv *Adres = new TDdeClientConv(this);
if(Adres->SetLink("iexplore", "WWW_GetWindowInfo") || Adres->SetLink("Netscape", "WWW_GetWindowInfo") ||
    Adres->SetLink("Mosaic", "WWW_GetWindowInfo") || Adres->SetLink("Netscp", "WWW_GetWindowInfo") ||
    Adres->SetLink("Mozilla", "WWW_GetWindowInfo") || Adres->SetLink("Firefox", "WWW_GetWindowInfo"))
{
  Edit1->Text = Adres->RequestData("0xFFFFFFFF, sURL, sTitle");
}
else
{
  Application->MessageBox("Nie odnaleziono żadnej obsługiwanej przeglądarki", "Komunikat", MB_OK | MB_ICONEXCLAMATION);
}
delete Adres;
}
//---------------------------------------------------------------------------


Nie sprawdzałem, ale powinno działać. Co do przeglądarki Opera, to nie wiem co jest kluczem, może Opera...

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
husky83
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Przechwytywanie adresów WWW

Nowy postprzez husky83 » poniedziałek, 21 grudnia 2009, 13:59

chociaż jeszcze tego nie testowałem, ale już to powiem - JESTEŚ WIELKI !! :)

Dzięki :)

PS. Ten sposób mi w zupełności wystarczy (jeśli zadziała, ale raczej tak), ale pytanko czysto teoretyczne - to działa aktywnie - co jakiś czas muszę odświeżać (czy jak w przykładzie - naciskać przycisk) żeby 'być na bieżąco'. Można jakoś to zautomatyzować? Nie wiem.. Zrobić lokalny serwer DNS przechwytujący adresy i przekierowujący na prawdziwy DNS? Lub jakiś inny sposób? :)


EDIT:
Działa :) (testowane dla IE i Firefoxa)
Dodam, że tryb porno tez mu nie straszny :)

Żeby zadziałało musiałem dodać:
Kod: Zaznacz cały
#include <DdeMan.hpp>


Tak więc jeszcze raz wielkie dzięki :)

Teraz tylko zrobić z tego usługę systemową lub ukryć w jakiś sposób program i wiem co robią ludziska podczas mojej nieobecności :)
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
Podziękował : 2
Otrzymał podziękowań: 0
Kompilator: C++ Builder
    NieznanyNieznana

Re: Przechwytywanie adresów WWW

Nowy postprzez husky83 » poniedziałek, 21 grudnia 2009, 16:55

Wszystko jest pięknie.. do czasu..

http://cyfbar.republika.pl/api2.html#api14
czyli tworzę sobie funkcję 'sprawdz', która jest wywoływana jako osobny wątek co jakiś czas... (Tworzenie wątków wg. porady z linku wyżej).

Po bezpośrednim wstawieniu kodu do funkcji wywoływanej jako osobny wątek - ZONK..

Kod: Zaznacz cały
   TDdeClientConv *URL = new TDdeClientConv(this);
[C++ Error] Unit1.cpp(32): E2297 'this' can only be used within a member function


Ok, rozumiem - nie może być 'this'. Problem pojawia się, gdy wpiszę tam "NULL", "Form1" lub cokolwiek innego. Kod kompiluje się, program uruchamia, ale funkcja
Kod: Zaznacz cały
   if(URL->SetLink("iexplore", "WWW_GetWindowInfo") || URL->SetLink("Netscape", "WWW_GetWindowInfo") ||
      URL->SetLink("Mosaic", "WWW_GetWindowInfo") || URL->SetLink("Netscp", "WWW_GetWindowInfo") ||
      URL->SetLink("Mozilla", "WWW_GetWindowInfo") || URL->SetLink("Firefox", "WWW_GetWindowInfo"))

ZAWSZE zwraca false, co jest równoznaczne z brakiem możliwości pobrania adresu :(

Jakieś pomysły?
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
Podziękował : 2
Otrzymał podziękowań: 0
Kompilator: C++ Builder
    NieznanyNieznana

Re: Przechwytywanie adresów WWW

Nowy postprzez Cyfrowy Baron » wtorek, 22 grudnia 2009, 11:01

Daj sobie spokój z wątkiem, zrób sprawdzanie w zdarzeniu OnIdle aplikacji. Zdarzenie OnIdle jest wykonywane zawsze gdy system nie wykonuje żadnych operacji. W Menadżerze zadań widnieje jako Proces bezczynności systemu, czyli jeżeli system jest zajęty jakimś zadaniem w 100% to zdarzenie OnIdle stoi, jeżeli istnieje jakiś procent wolnej mocy to zdarzenie OnIdle działa podobnie do TTimer. Zaletą jest to, że zadanie programu wykonywane w zdarzeniu OnIdle nie obciąża systemu.

Kod: Zaznacz cały
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>

#include <winsock.h>
#include <DdeMan.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
    TListBox *ListBox1;
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private:   // User declarations
      void __fastcall AppIdle(TObject *Sender, bool &Done);
      TDdeClientConv *Adres;
public:      // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
Application->OnIdle = AppIdle;

Adres = new TDdeClientConv(this);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AppIdle(TObject *Sender, bool &Done)
{
if(Adres->SetLink("iexplore", "WWW_GetWindowInfo") ||
    Adres->SetLink("Netscape", "WWW_GetWindowInfo") ||
    Adres->SetLink("Mosaic", "WWW_GetWindowInfo")   ||
    Adres->SetLink("Netscp", "WWW_GetWindowInfo")   ||
    Adres->SetLink("Mozilla", "WWW_GetWindowInfo")  ||
    Adres->SetLink("Firefox", "WWW_GetWindowInfo"))
{
  ListBox1->Items->Add(Adres->RequestData("0xFFFFFFFF, sURL, sTitle"));
  Application->ProcessMessages();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete Adres;   
}
//---------------------------------------------------------------------------


Wadą tego rozwiązania jest, że przechwytywanie adresów odbywa się tylko wtedy gdy system nie jest zajęty.

Co do Twojego problemu z wątkami, to podany w serwisie sposób na wątki nie jest dobry, ale jak chcesz to go używaj, jednak musisz zadeklarować obiekt klasy TDdeClientConv w pliku nagłówkowym w sekcji public:

Kod: Zaznacz cały
public:
        TDdeClientConv *Adres;


potem definiujesz go w pliku źródłowym w konstruktorze klasy:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Adres = new TDdeClientConv(this);
}


W wątku odwołujesz się do obiektu Adres odpowiednio go adresując:

Kod: Zaznacz cały
if(Form1->Adres->SetLink("iexplore", "WWW_GetWindowInfo") ||
    Form1->Adres->SetLink("Netscape", "WWW_GetWindowInfo") ||
    Form1->Adres->SetLink("Mosaic", "WWW_GetWindowInfo")   ||
    Form1->Adres->SetLink("Netscp", "WWW_GetWindowInfo")   ||
    Form1->Adres->SetLink("Mozilla", "WWW_GetWindowInfo")  ||
    Form1->Adres->SetLink("Firefox", "WWW_GetWindowInfo"))
{
  ListBox1->Items->Add(Adres->RequestData("0xFFFFFFFF, sURL, sTitle"));
  Application->ProcessMessages();
}


Przyjrzyj się podanemu przeze mnie wyżej kodowi. Jeżeli deklarujesz obiekt jako publiczny, czyli w sekcji public, to nie deklarujesz go już ponownie, mam nadzieję, że wiesz czym się różnią między sobą obiekty lokalne prywatne globalne i publiczne. Nie możesz też tego obiektu niszczyć wewnątrz funkcji. Niszczysz go raz w zdarzeniu OnClose formularza.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Przechwytywanie adresów WWW

Nowy postprzez husky83 » wtorek, 22 grudnia 2009, 17:20

Cyfrowy Baron napisał(a):Daj sobie spokój z wątkiem, zrób sprawdzanie w zdarzeniu OnIdle aplikacji.

Też póki co to zrobiłem - narazie jest na zwykłym timerze :)
Cyfrowy Baron napisał(a):(...)Wadą tego rozwiązania jest, że przechwytywanie adresów odbywa się tylko wtedy gdy system nie jest zajęty.

I to jest właśnie dla mnie niestety nie do przyjęcia - program musi zawsze, w każdych warunkach pobrać adres...


Cyfrowy Baron napisał(a):Co do Twojego problemu z wątkami, to podany w serwisie sposób na wątki nie jest dobry, ale jak chcesz to go używaj, jednak musisz zadeklarować obiekt klasy TDdeClientConv w pliku nagłówkowym w sekcji public(...)

O ile mnie pamięć nie myli ktoś na forum napisał jak powinno się tworzyć wątki, metoda dużo bardziej skomplikowana niż ta z poradnika, jednak mi ta podana przez Ciebie wystarcza (nie licząc tego przypadku).


Cyfrowy Baron napisał(a):Jeżeli deklarujesz obiekt jako publiczny, czyli w sekcji public, to nie deklarujesz go już ponownie, mam nadzieję, że wiesz czym się różnią między sobą obiekty lokalne prywatne globalne i publiczne
To wiem aż za dobrze, nauczyłem się tego jakiś czas temu, kiedy stawiałem pierwsze kroki w C++, kiedy to przez kilka godzin próbowałem to obejść (aż do czasu, aż mi internet naprawili - potem znalazłem błąd). Od tego czasu wiem doskonale co i jak :)

Wadą zwykłego timera jest to, że gdy zechcę przywołać formatkę i cokolwiek na niej zrobić - obsługa pobierania adresu na tyle zajmuje program, że formatka chwilkę 'wisi', dlatego chcę to zrobić w osobnym wątku.. Ale chyba faktyczine zrobię to tak jak napisałeś - z globalnie zadeklarowanym obiektem.
Póki co więcej pytań nie mam, więc jakby co to WESOŁYCH ŚWIĄT I SZCZĘŚLIWEGO NOWEGO ROKU !! :)





EDIT:
Zrobiłem z ciekawości wersję z globalnym Adres (czy też raczej URL, bo tak to u mnie jest nazwane) i.. nic z tego - ten sam błąd - program nie potrafi pobrać adresu i twierdzi, że żadna przeglądarka nie jest załączona.. Chyba muszę podejść do tego z zupełnie innej strony, ale jeszcze nie wiem jakiej :)
Pozdrawiam :)
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
Podziękował : 2
Otrzymał podziękowań: 0
Kompilator: C++ Builder
    NieznanyNieznana

Re: Przechwytywanie adresów WWW

Nowy postprzez mko000 » sobota, 9 stycznia 2010, 15:35

Wie ktos jaka nazwę trzeba wpisać dla Chrome? (Chrome nie pasuje)
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
Podziękował : 35
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    Windows XPChrome

Re: Przechwytywanie adresów WWW

Nowy postprzez Cyfrowy Baron » sobota, 9 stycznia 2010, 17:01

Zainstaluj i sprawdź klasę programem WinID.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Przechwytywanie adresów WWW

Nowy postprzez mko000 » sobota, 9 stycznia 2010, 18:06

Ok ale klase którego miejsca ? Sprawdzałem na Ie to klasa wg twojej porady to iexplore a nigdzie tym programem tej klasy nie moge znalesc. Na co nakierować myszkę ?
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
Podziękował : 35
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    Windows XPChrome

Re: Przechwytywanie adresów WWW

Nowy postprzez Cyfrowy Baron » sobota, 9 stycznia 2010, 18:37

Nie wiem, ale poszukałem w google i wszędzie jest podane, że nazwa klasy tej przeglądarki to chrome.
Po za tym jak zapewne już zauważyłeś to forum też pobiera nazwę przeglądarki używanej przez osoby piszące posty. Skrypt php bazuje na klasach przegladarek i jest w nim dla przeglądarki Chrome podana właśnie klasa chrome.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Przechwytywanie adresów WWW

Nowy postprzez husky83 » poniedziałek, 1 lutego 2010, 13:58

Mam dodatkowe pytanie, chociaż nie do końca związane z tematem..

Pobrałem adres, jest on u mnie na liście stron 'zakazanych'.. (chociaż wcześniejsza aplikacja służyła do czegoś innego, teraz robię sobie 'blockera'). Czy istnieje możliwość zmiany adresu strony w przeglądarce w taki sposób, aby ta 'zła' została zastąpiona innym adresem? Lub chociaż 'kliknięcia' przycisku 'odśwież' w przeglądarce? Oczywiście wszystko z poziomu mojego programu :)
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
Podziękował : 2
Otrzymał podziękowań: 0
Kompilator: C++ Builder
    Windows XPFirefox

Re: Przechwytywanie adresów WWW

Nowy postprzez Cyfrowy Baron » poniedziałek, 1 lutego 2010, 14:57

Kod: Zaznacz cały
#include <winsock.h>
#include <DdeMan.hpp>
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TDdeClientConv *Adres = new TDdeClientConv(this);
Adres->SetLink("Firefox", "WWW_OpenURL");
Adres->RequestData("http://cyfbar.republika.pl/");
delete Adres;
}
//---------------------------------------------------------------------------


Z tym, że to otwiera adres w nowym oknie przeglądarki lub w nowej karcie w zależności od ustawień przeglądarki.
Żeby otworzyć w tym samym oknie lub karcie, trzeba by chyba wysłać komunikat, ale o tym to juz było na tym forum wielokrotnie, a o wysyłaniu komunikatów możesz przeczytać w serwisie Cyfrowy Baron w dziale: teoria -> Sterowanie obcym programem z poziomu własnego poprzez wysyłanie komunikatów.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 5 gości