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 :) |
|
DeBugger |
» 2008-12-30 10:40:29 Jaka top biblioteka? LibCurl? |
|
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 if( domyslna_przegladarka != IE ) { ShellExecute( NULL, "open", "http://ddt.pl", "", NULL, SW_SHOWNORMAL ); }; else { 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ć ;) |
|
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. |
|
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 :) |
|
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 ;) |
|
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: if( strcmp( wartosc, explorer ) == 0 ) { } else { }
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; |
|
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 if( strcmp( wartosc, explorer ) == 0 ) { MessageBox( 0, "Masz IE", "Przeglądarka", MB_OK ); RegCloseKey( klucz ); 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, "Odczytana wartość", MB_OK ); RegCloseKey( klucz2 ); char wartosc3[ 256 ]; strncpy( wartosc3, wartosc2, 49 ); MessageBox( 0, wartosc3, "Odczytana wartość", MB_OK ); ShellExecute( hwnd, "open", wartosc3, "www.ddt.pl", NULL, SW_SHOWNORMAL ); } else { MessageBox( 0, "Nie masz IE", "Przeglądarka", MB_OK ); RegCloseKey( klucz ); ShellExecute( hwnd, "open", "www.ddt.pl", "", NULL, SW_SHOWNORMAL ); }; 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:\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 |
|
« 1 » 2 |