Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: 'Patzick'
Korekta redakcyjna: Piotr Szawdyński
WinAPI i Windows

[WinAPI, C++] Otwieranie stron Internetowych z poziomu własnej aplikacji

[artykuł] Artykuł opisuje jak otworzyć stronę Internetową o podanym adresie z poziomu własnej aplikacji, używając domyślnej przeglądarki Internetowej użytkownika.
Sprawa otwarcia strony w przeglądarce Internetowej przy użyciu własnej aplikacji jest stosunkowo prosta. Problem zaczyna się na rozgraniczeniu otwarcia linku na nowej karcie bądź w nowym oknie. Sposobem na to jest wgłębienie się w rejestr użytkownika i wyciągnięcie z niego informacji takich jak:
  • domyślna przeglądarka,
  • miejsce zainstalowania domyślnej przeglądarki.
Wyciągnięcie tych informacji jest również proste, jeśli tylko zna się adres tychże danych w rejestrze. W kodzie, który zaraz zamieszczę będzie widać w jakimże to miejscu są przechowywane wspomniane informacje. Oto kod:
C/C++
//INFO: definiujemy dwa klucze, gdyż 2 wartości musimy odczytać
HKEY klucz;
HKEY klucz2;

//INFO: otwarcie klucza funkcją RegOpenKeyEx
if( RegOpenKeyEx( HKEY_CLASSES_ROOT, "HTTP\\shell\\open\\ddeexec\\Application", 0, KEY_READ, & klucz ) != ERROR_SUCCESS )
     MessageBox( 0, "Nie można otworzyć klucza", "Błąd", MB_OK );

CHAR wartosc[ 256 ]; //INFO: łańcuch znaków na odczytaną wartość
DWORD rozmiar; //INFO: rozmiar odczytanej wartości(w bajtach)
DWORD typ_danych = REG_SZ; //INFO: zmienna na typ danych
DWORD typ_danych2 = REG_BINARY;

//INFO: odczytanie wartości z klucza
if( RegQueryValueEx( klucz, "", 0, & typ_danych,( LPBYTE ) wartosc, & rozmiar ) != ERROR_SUCCESS )
     MessageBox( 0, "Nie można odczytać wartości", "Błąd", MB_OK );

RegCloseKey( klucz ); //INFO: zamknięcie klucza który już nie będzie nam potrzebny

//INFO: pokazanie wyników
MessageBox( 0, wartosc, "Twoja domyślna przeglądarka to: ", MB_OK ); //pokazanie odczytanej wartosci
Jak łatwo zauważyć miejscem przechowywania nazwy domyślnej przeglądarki, jest ścieżka
HTTP\shell\open\ddeexec\Application
 w gałęzi HKEY_CLASSES_ROOT. Nazwy są podawane w skrótach, np dla Mozilli odczytana wartość to Firefox, a dla Internet Explorer IExplore.

Dobra to mamy już domyślną przeglądarkę, co może się przydać nie tylko do otwierania linków :) Następnym krokiem jest adres zainstalowanej przeglądarki i tu znów sięgamy po informacje do rejestru:
C/C++
if( RegOpenKeyEx( HKEY_CLASSES_ROOT, "HTTP\\shell\\open\\command", 0, KEY_READ, & klucz2 ) != ERROR_SUCCESS )
     MessageBox( 0, "Nie można otworzyć klucza", "Błąd", MB_OK );

char wartosc2[ 256 ]; //INFO: łańcuch znaków na odczytaną wartość
DWORD rozmiar2 = 256;
if( RegQueryValueEx( klucz2, "", 0, & typ_danych,( LPBYTE ) wartosc2, & rozmiar2 ) != ERROR_SUCCESS )
     MessageBox( 0, "Nie można odczytać wartości", "Błąd", MB_OK );

//INFO: pokazanie wyników
MessageBox( 0, wartosc2, "Adres do przeglądarki: ", MB_OK );
RegCloseKey( klucz2 );
Informacje o zainstalowanej przeglądarce wyciągamy z gałęzi rejestru HKEY_CLASSES_ROOT natomiat ścieżka, która nas interesuje to
HTTP\\shell\\open\\command
. Załóżmy że domyślną przeglądarką jest Internet Explorer, otrzymana wartość będzie mniej więcej taka (chyba, że ktoś ma gdzie indziej zainstalowaną przeglądarkę IE):
"C:\Program Files\Internet Explorer\iexplore.exe" -nohome
Zostaje nam już tylko pozbyć się dodatkowych parametrów ze ścieżki i już można działać. Zrobimy to tak:
C/C++
string wartosc3 = wartosc2;
string pocz = "\"";
string kon = ".EXE";
string::size_type a = wartosc3.find( pocz );
string::size_type b = wartosc3.find( kon );
char * wartosc4 = new char[ b + 5 ];
wartosc3.copy( wartosc4, b + 5, a );

//INFO: wielka iluminacja czyli otwarcie w nowym oknie :)
ShellExecute( hwnd, "open", wartosc4, "www.cpp0x.pl", NULL, SW_SHOWNORMAL );
Możesz teraz albo pozwolić użytkownikowi wybrać jak chce otwierać strony bądź być samolubem i narzucić jakiś sposób :p Tak czy inaczej mam nadzieję, że artykuł pomoże w kwestii otwierania linków :)