Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Otwieranie strony internetowej z poziomu własnej aplikacji

Ostatnio zmodyfikowano 2009-04-21 08:14
Autor Wiadomość
DejaVu
Temat założony przez niniejszego użytkownika
Otwieranie strony internetowej z poziomu własnej aplikacji
» 2008-12-29 23:25:22
Otwieranie strony internetowej z poziomu własnej aplikacji jest generalnie proste:
ShellExecute( NULL, "open", "http://ddt.pl", "", "", SW_SHOWNORMAL );

Problem się zaczyna gdy chcemy, aby się otwierało w nowym oknie. Informacje o tym znalazłem na tej stronie http://www.codeproject.com/KB/IP/urlnewwindow.aspx. Nie są one sprawdzone, tak więc temat jest do dyskusji :)
P-3074
DeBugger
» 2008-12-30 10:40:29
Jaka top biblioteka? LibCurl?
P-3076
Patzick
» 2008-12-30 12:28:26
nie, to jest z <windows.h> ogólnie funkcja ta może otwierać ine pliki aplikacje itp ale głównie problem jest, żeby móc rozgraniczyć między otwieraniem w oknie i na nowej karcie. Mi w Mozilli wszystko działa ok, otwiera nowa kartę i nie ma problemu, ale np Piotr ma explorera i jak mu otwiera to na stronie którą miał otwartą co jest efektem niepożądanym :P.
Jest na to sposób, jeżeli wiesz, że przeglądarka to explorer możesz dać kod
ShellExecute( NULL, "open", "C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE", "http://ddt.pl", NULL, SW_SHOWNORMAL );
program najpierw otworzy explorera (nawet jeśli jakiś już działa) i na nim wejdzie na jakąś stronę. Jednak jeżeli program ma być dla większej ilości użytkowników o różnych przeglądarkach ten sposób nie sprawdza się.
Piotr wpadł na pomysł, żeby znaleźć w rejestrze domyślną przeglądarkę i wzorem mniej więcej takim
C/C++
if( domyslna_przegladarka != IE ) {
    //otwórz w nowej karcie
    ShellExecute( NULL, "open", "http://ddt.pl", "", NULL, SW_SHOWNORMAL );
};
else {
    //otwórz w nowym oknie
    ShellExecute( NULL, "open", "C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE", "http://ddt.pl", NULL, SW_SHOWNORMAL );
Sposób całkiem przyjemny, jedynie teraz trzeba znaleźć w rejestrze domyślną przeglądarkę, postaram się znaleźć jak to zrobić ;)
P-3079
pixelmaster
» 2008-12-30 12:33:40
A ja mam na dysku C Linuksa, a Windowsa na dysku D. Czyli tym sposobem (jeśli używałbym IE) pod windowsem strona mi się nie otworzy.
P-3080
Patzick
» 2008-12-30 13:43:18
nie wgłębiałem się w to, miejsce IE również można wyciągnąć z rejestru przez "FilesDir" ale uwaga słuszna :P ja ciągle szukam gdzie sprawdzić tą domyślną przeglądarkę, potem już (chyba :)) z górki

//EDIT

HKEY_CLASSES_ROOT\HTTP\shell\open\ddeexec\Application
tutaj jest podana domyślna przeglądarka, czas na eksperymenty :)
P-3081
Patzick
» 2009-01-02 15:19:06
Nie było mnie trochę więc mam małe zaległości. Wziąłem się za to dziś i wyszło mi prawie dobrze, prawie bo nie wiem dlaczego nie chce mi porównać wartości. Ale najpierw kod.

[CODE SRc="C++"]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];
CHAR explorer[256] = "IExplore"; //coś już tu chyba zgrzyta

DWORD rozmiar;
DWORD typ_danych=REG_SZ;

//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);

//pokazanie wyników
MessageBox(0,wartosc,"Odczytana wartość",MB_OK); //do tego momentu jest super, pokazuje nazwę przeglądarki, problem zaczyna się dalej

if(wartosc != explorer) MessageBox(0,"Nie masz IE","Przeglądarka",MB_OK);
if(wartosc == explorer) MessageBox(0,"Masz IE","Przeglądarka",MB_OK);

RegCloseKey(klucz);
[/code]

Pierwszy if działa zawsze, czy domyślna jest IE czy Firefox, ale nie wiem dlaczego "wartość" nie chce się równać "explorer" nawet jeśli pokazuje taki sam napis "IExplore"
Mam nadzieję, że ktoś ma jakieś większe doświadczenie z rejestrem i wie co jest nie tak :)

P.S. Wiem też jak sprawdzić gdzie jest zainstalowana przeglądarka ale to w następnym kodzie gdy tylko rozgryziemy te porównywanie ;)
P-3213
DejaVu
Temat założony przez niniejszego użytkownika
» 2009-01-03 03:37:13
Jeśli zapisujesz tekst do tablicy znaków, musisz porównywać je za pomocą funkcji strcmp(), czyli:
C/C++
if( strcmp( wartosc, explorer ) == 0 )
{
    //takie same
} else
{
    //różne
}
Gdyby jedna z tych zmiennych była stringiem taka operacja jest zbędna, ponieważ klasa std::string ma przeciążone operatory porównania i robi to tak jak podpowiada nam nasza intuicja, czyli porównuje tekst.

/edit:
Problem nieodczytywania wartości:
Ostatni parametr to rozmiar bufora, do którego zapisujesz odczytywaną wartość. Poniższy wiersz rozwiąże problem:
DWORD rozmiar2 = 256;
P-3285
Patzick
» 2009-01-03 20:03:17
po rozwiązaniu tych dwóch problemów z Piotrem sprawa dla IE została już chyba zrobiona, oto kod z wyjaśnieniem
C/C++
if( strcmp( wartosc, explorer ) == 0 ) //porównanie artości wg rady Piotra
{
    //takie same
    MessageBox( 0, "Masz IE", "Przeglądarka", MB_OK );
    RegCloseKey( klucz ); //zamykamy klucz bo już go nie potrzebujemy
    if( RegOpenKeyEx( HKEY_CLASSES_ROOT, "HTTP\\shell\\open\\command",
    0, KEY_READ, & klucz2 ) != ERROR_SUCCESS ) //otwieramy nowy z adresem zainstalowanej domyślnej przeglądarki (chodzi nam o IE)
         MessageBox( 0, "Nie można otworzyć klucza", "Błąd", MB_OK );
   
    CHAR wartosc2[ 256 ]; //zmienne
    DWORD rozmiar2 = 256; //tu ważne rozmiar też trzeba było podać
    if( RegQueryValueEx( klucz2, "", 0, & typ_danych,( LPBYTE ) wartosc2, & rozmiar2 ) != ERROR_SUCCESS )
         MessageBox( 0, "Nie można odczytać wartości", "Błąd", MB_OK );
    //pokazanie wyników
    MessageBox( 0, wartosc2, "Odczytana wartość", MB_OK ); //cała ścieżka
    RegCloseKey( klucz2 );
    char wartosc3[ 256 ];
    strncpy( wartosc3, wartosc2, 49 ); //pobranie 49 znaków z wartości gdzie podana jest ścieżka dostępu
    MessageBox( 0, wartosc3, "Odczytana wartość", MB_OK );
    ShellExecute( hwnd, "open", wartosc3, "www.ddt.pl", NULL, SW_SHOWNORMAL ); //podstawienie ścieżki dostępu z otwarciem linku
   
} else
{
    //różne
    MessageBox( 0, "Nie masz IE", "Przeglądarka", MB_OK );
    RegCloseKey( klucz );
    ShellExecute( hwnd, "open", "www.ddt.pl", "", NULL, SW_SHOWNORMAL ); //użycie innej domyślnej przeglądarki
};

Po porównaniu wartości, jeżeli dojdziemy do wniosku, że przeglądarką jest IE musimy pobrać miejsce gdzie jest zainstalowana. Wartość2 po odczytaniu wynosi
C/C++
"C:\Program Files\Internet Explorer\iexplore.exe" - nohome ";
niestety parametr -nohome uniemożliwia wykorzystanie tej zmiennej do otwarcia przeglądarki, więc pobieramy 49 znaków ze zmiennej wartosc2 i przenosimy ją do wartosc3. Gotowe :) wystarczy użyć wartosc3 jako ścieżkę do programu i mamy otwieranie przeglądarki IE w nowym oknie ;)

P.S. Teraz to trochę chaotyczne, ale po skończeniu projektu zajmę się opracowaniem artykułu na ten temat :)

I oczywiście dalej zachęcamy do dyskusji :)

//EDIT
zmienimy algorytm wycinania znaków, gdyż ten może nie działać na innych windach, trzeba wyszukać w wartosc2 ".exe."" i resztę uciąć, wtedy będzie działało wszędzie...przynajmniej powinno :P
P-3345
« 1 » 2
  Strona 1 z 2 Następna strona