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:
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:
HKEY klucz;
HKEY klucz2;
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 ];
DWORD rozmiar;
DWORD typ_danych = REG_SZ;
DWORD typ_danych2 = REG_BINARY;
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 );
MessageBox( 0, wartosc, "Twoja domyślna przeglądarka to: ", MB_OK );
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:
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 ];
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 );
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:
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 );
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 :)