WebBrowser + domyślna przeglądarka

problemy z funkcjonowaniem bibliotek, komponentów itp.

WebBrowser + domyślna przeglądarka

Nowy postprzez husky83 » poniedziałek, 15 lutego 2010, 12:12

Witam,
WebBrowser bazuje na IE. To wiemy. Cokolwiek otworzy się w kontrolce WebBrowser - jest wyświetlane jak w IE, a kliknięcie linka wewnątrz WebBrowsera powoduje otwarcie IE z daną stroną...
I to jest właśnie mój problem.. Chciałbym, aby kliknięcie czegokolwiek w WebBrowser powodowało otwarcie domyślnej przeglądarki. Chciałem cały program napisać w wxDev c++, tam w wxHTMLWindow można tak zrobić, jednak dla mnie ma jedną zasadniczą wadę: wxhtml nie obsługuje javascriptu, który chcę wykorzystać na stronie, która będzie otwierana.

Drugi problem jest taki, że chciałbym dynamicznie tworzyć zawartość strony wyświetlanej w WebBrowserze.. Czy można to jakoś zrobić? Jedyne co przychodzi mi do głowy, to dodanie małego serwera do programu i łączenie się z localhostem (kod html będzie generowany przez C++).


EDIT:
dodałem zdarzenie 'onBeforeNavigate2', z niego można wyciągnąć kliknięty adres.. Jednak pozostaje problem z tym, że nie mogę potem zatrzymać ładowania klikniętej strony.. WebBrowser1->Stop() nie działa.. 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
    Windows XPFirefox

Re: WebBrowser + domyślna przeglądarka

Nowy postprzez wargo » poniedziałek, 15 lutego 2010, 16:53

husky83 napisał(a):Drugi problem jest taki, że chciałbym dynamicznie tworzyć zawartość strony wyświetlanej w WebBrowserze.. Czy można to jakoś zrobić? Jedyne co przychodzi mi do głowy, to dodanie małego serwera do programu i łączenie się z localhostem (kod html będzie generowany przez C++).


EDIT:
dodałem zdarzenie 'onBeforeNavigate2', z niego można wyciągnąć kliknięty adres.. Jednak pozostaje problem z tym, że nie mogę potem zatrzymać ładowania klikniętej strony.. WebBrowser1->Stop() nie działa.. Jakieś pomysły?

1. http://cyfbar.republika.pl/siec.html#siec4
2.A czy w tym wypadku nie powinieneś użyć funkcji stop2()?

Za ten post autor wargo otrzymał podziękowanie od:
husky83
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    WindowsMozilla

Re: WebBrowser + domyślna przeglądarka

Nowy postprzez Cyfrowy Baron » poniedziałek, 15 lutego 2010, 17:01

WebBrowser1->Stop() nie działa.


U mnie działa, zatrzymuje ładowanie strony w kontrolce WebBrowser.



Cokolwiek otworzy się w kontrolce WebBrowser - jest wyświetlane jak w IE, a kliknięcie linka wewnątrz WebBrowsera powoduje otwarcie IE z daną stroną...
I to jest właśnie mój problem.. Chciałbym, aby kliknięcie czegokolwiek w WebBrowser powodowało otwarcie domyślnej przeglądarki.


To czy strona otworzy się w tym samym oknie czy w nowym oknie lub w nowej zakładce zależy od konstrukcji samego linku:

Kod: Zaznacz cały
<a target="_self" href="http://cyfbar.republika.pl/">Cyfrowy Baron</a></p>


Parametr target="_self" nakazuje otwarcie strony w tym samym oknie, gdyby link zawierał parametr target="_blank" wtedy strona do której prowadzi link otwarłaby się w drugim oknie niestety nie w przeglądarce domyślnej, lecz w IE.



dodałem zdarzenie 'onBeforeNavigate2', z niego można wyciągnąć kliknięty adres.


Można przechwycić adres linku na który wskazuje kursor myszy w zdarzeniu OnStatusTextChange:

Kod: Zaznacz cały
void __fastcall TEdytorMainForm::WebBrowser1StatusTextChange(TObject *Sender,
      BSTR Text)
{
String link = (String)Text;
}




Drugi problem jest taki, że chciałbym dynamicznie tworzyć zawartość strony wyświetlanej w WebBrowserze.


Tego nie rozumiem...
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: WebBrowser + domyślna przeglądarka

Nowy postprzez polymorphism » poniedziałek, 15 lutego 2010, 17:52

Cyfrowy Baron napisał(a):Tego nie rozumiem...

Chodzi mu o to, że chce stronę wygenerować w programie (coś jak skrypty PHP), a nie czytać gotową stronę z dysku, z sieci lub czegokolwiek innego.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: WebBrowser + domyślna przeglądarka

Nowy postprzez Cyfrowy Baron » poniedziałek, 15 lutego 2010, 20:14

No to wargo podał już link do porady, jak wczytywać pliki z zasobów do kontrolki CppWebBrowser. Przepisywanie odbywa się za pośrednictwem klasy TMemoryStream, więc wystarczy taki skrypt zapisać do tej klasy, a potem przenieść do CppWebBrowser.
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: WebBrowser + domyślna przeglądarka

Nowy postprzez husky83 » wtorek, 16 lutego 2010, 08:57

no i wielkie dzięki :) co ja bym bez Was zrobił :) Szkoda, że sam nie mam takiej wiedzy, żeby móc się Wam odwdzięczyć też pomocą... :) :)
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: WebBrowser + domyślna przeglądarka

Nowy postprzez wargo » wtorek, 16 lutego 2010, 15:44

Możesz nacisnąć ikonę rączki w prawym górnym rogu wiadomości, która zasługuje na pochwałę!
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    WindowsMozilla

Re: WebBrowser + domyślna przeglądarka

Nowy postprzez husky83 » wtorek, 16 lutego 2010, 23:37

i to też niniejszym czynię :)

Dla potomnych zostawiam mój sposób na otwieranie linka w domyślnej przeglądarce:
Deklaruję sobie globalnie:
Kod: Zaznacz cały
AnsiString status;

Następnie na WebBrowser zdarzenie onStatusTextChange, a dokładniej:
Kod: Zaznacz cały
void __fastcall TForm1::WebBrowser1StatusTextChange(TObject *ASender,
      const WideString Text)
{
   status = (String)Text;
}


Korzystając z porady Wstawianie własnego PopupMenu do kontrolki TCppWebBrowser dodałem nowe zdarzenie - kliknięcie w WebBrowserze
Kod: Zaznacz cały
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{

if(Msg.message == WM_LBUTTONDOWN || Msg.message == WM_LBUTTONUP)
{

  HWND hWnd = WindowFromPoint(cP);
  char szClassName[255];
  char windowName[255];
  GetClassName(hWnd, szClassName, 255);
  if((String)szClassName == "Internet Explorer_Server")
  {
   if (status.Length()>0)
   {
      // dodatkowo czy 'http://
      AnsiString tmp=status;
      if(tmp.SetLength(7).LowerCase()=="http://")
      {
          ShellExecute(Handle, "open", status.c_str(), NULL, NULL, SW_SHOWNORMAL);
      }
   }
  }
}


}


Zdaję sobie sprawę, że można to zrobić duuużo ładniej, ale póki co mi to wystarcza i jest to dostosowane do moich wymagań ;-) Sposób ten nie uwzględnia wszelkich zmian adresu przez np. javascript, reaguje WYŁĄCZNIE na kliknięcia oraz bardzo łatwo 'zakłócić' otwieranie stron. Jednak w moim przypadku jest to wystarczające - będzie służyło wyłącznie do obsługi 'własnej' strony, nie będą otwierane żadne obce strony, na których mogłoby sie pojawić coś, co zakłóci działanie tego sposobu (np. sztuczny status czy kod javascript).

PS. mi WebBrowser1->Stop() niestety nie chce zatrzymać ładowania strony (przynajmniej w zdarzeniu 'onBeforeNavigate2'), a WebBrowser1->Stop2() nie istnieje... Ale powyższy sposób w pełni zastępuje wcześniejsze kombinacje :)
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: WebBrowser + domyślna przeglądarka

Nowy postprzez Cyfrowy Baron » środa, 17 lutego 2010, 10:40

mi WebBrowser1->Stop() niestety nie chce zatrzymać ładowania strony (przynajmniej w zdarzeniu 'onBeforeNavigate2')


Wywołanie tej funkcji w tym zdarzeniu niestety nie zadziała. Pisząc, że u mnie działa miałem na myśli "ręczne" wywołanie tej funkcji, czyli np. w zdarzeniu OnClick przycisku typu TButtton.

Jak rozumiem, chcesz zatrzymać ładowanie strony po kliknięciu na link, tak by kliknięcie na tenże link otwierało link w przeglądarce domyślnej i jednocześnie nie ładowało linku w kontrolce WebBrowser?!
Należy tutaj posłużyć się zdarzeniem OnDownloadBegin, które jest wywoływane po rozpoczęciu ładowania strony:

Kod: Zaznacz cały
void __fastcall TForm1::WebBrowser1DownloadBegin(TObject *Sender)
{
    WebBrowser1->Stop();
}


Musisz oczywiście dodać jakiś mechanizm sterujący, tak by można było wogóle załadować stronę, gdy zachodzi taka potrzeba i powstrzymać ładowanie, gdy jest to zbędne, więc może coś takiego:

Kod: Zaznacz cały
bool stopLink = false;

void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
    if(Msg.message == WM_LBUTTONDOWN || Msg.message == WM_LBUTTONUP)
    {

     stopLink = true;

      HWND hWnd = WindowFromPoint(cP);
      char szClassName[255];
      char windowName[255];
      GetClassName(hWnd, szClassName, 255);
      if((String)szClassName == "Internet Explorer_Server")
      {
       if (status.Length()>0)
       {
          // dodatkowo czy 'http://
          AnsiString tmp=status;
          if(tmp.SetLength(7).LowerCase()=="http://")
          {
              ShellExecute(Handle, "open", status.c_str(), NULL, NULL, SW_SHOWNORMAL);
          }
       }
      }
    }
}
//--------------------------------------------------------------------------------------------------------
void __fastcall TForm1::WebBrowser1DownloadBegin(TObject *Sender)
{
   if(stopLink)
   {
    WebBrowser1->Stop();
    stopLink = false;
   }
}
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 Biblioteki i komponenty

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron