Как открыть ссылку в новом окне браузера

Немного рекламы

В чем суть проблемы

На форумах часто попадается вопрос типа: "Как можно открыть ссылку в новом окне браузера". Причем надо заметить, что это вопрос по программированию под Windows, а не по web-мастерингу. Проблема возникает из-за того, что при "обычном" открывании ссылки функцией ShellExecute(Ex) (например так: ShellExecute (hwnd, "open", "http://www.microsoft.com", NULL, NULL, SW_SHOWNORMAL);) открываемый адрес может быть открыт в уже существующем окне браузера и из-за этого может потеряться открытая там в данный момент страница. Все выше сказанное относится к браузерам Internet Explorer и Mozilla (начиная с версии 1.1, зачем они это сделали, не понятно). В Opera и Mozilla 1.0 этого безобразия нет. В этой статье я буду рассматривать эту проблему применительно к браузерам Internet Explorer 6 (IE6), Mozilla 1.2 и Opera 7b2. Но, скорее всего, для более старых браузеров, все будет так же, с той лишь разницей, что в Mozilla 1.0 такой проблемы нет впринципе. Если Mozilla 1.0 - браузер по-умолчанию, то там всегда сайты открываются в новом окне.

Что делать

После долгих поисках в MSDN, я наткнулся на следующую таблицу:

-channelbandInternet Explorer as a Desktop Toolbar, displaying the Channels Directory of the currently logged on user. This option only applies when Active Desktop is off.
-eLaunch Internet Explorer in Explorer mode (standard two pane view, My Computer on left, Content on right)
-newStart up Internet Explorer in a separate process.
-nohomeOpen Internet Explorer and don't open any Web page at all.
-kLaunch Internet Explorer in Kiosk mode.

Причем эта таблица относится еще к IE 4.0. Казалось бы на этом можно было бы и остановиться, но, как оказывается, нам это абсолютно ничем не поможет. И вот почему.

  • Если пользоваться этим параметром, то мы должны его опередавать 4-го аргумента функции ShellExecute (здесь и дальше суффикс Ex я буду опускать), но на месте этого параметра (как показала практика) должен быть адрес.
  • Если пытаться "запихнуть" в параметр командной строки и -new и адрес (то есть там писать "-new http://www.microsoft.com" или "http://www.microsoft.com -new", то из этого ничего не выйдет, т.к. похоже, что IE смотрит только первый параметр.
  • Мы будем "жестко" привязаны к IE (т.к. неизвестно, есть ли такой параметр у других браузеров), что нас не устраивает - у пользователя должен быть выбор, каким браузером пользоваться.

После долгих экспериментов оказалось, что все решается намного проще (на первый взгляд). Достаточно написать следующую строку. ShellExecute (HWND_DESKTOP, _TEXT("open"), Browser, Url, NULL, SW_SHOWNORMAL);
Где Browser - путь к браузеру по умолчанию; Url - нужная нам ссылка.
И все, но возникла вторая проблема.

Как определить браузер по-умолчанию.

Здесь надо предостеречь от частой ошибки. Часто счтитают, что браузер по-умолчанию, это та программа, которая открывает файлы формата html и смотрят в реестре программу, которая зарагистрировано на расширение html и ее используют. А в MSDN вообще был пример, который создавал файл html и функцией FindExecutable определяли, какой программой он откроется. Это в корне неправильно. И вот почему. Можно открывать у себя с харда html-файлы одним браузером, а открывать адреса другим. Например, файлы я читаю Оперой, а в Инете сижу под Мозиллой. Заблуждение, может быть, возникло из-за того, что если в IE поставить его как браузер по-умолчанию, то он будет и для сайтов и для файлов. Как поется у Арии "Мир обречен, выбора нет". А нам этот выбор нужен. Поэтому в Мозилле и в Опере можно выбирать, для чего использовать данный браузер, вплоть до протоколов.

Так как же быть. А вот как. Надо прочитать значение из реестра по следующему пути: HKEY_CLASSES_ROOT\http\shell\open\command. И уже из этой строки "выудить" путь к браузеру. Именно "выудить", так как каждый браузер пишет туда все, что хочет. Вот вам таблица (обратите внимание на кавычки.

Internet Explorer"E:\Program Files\Internet Explorer\iexplore.exe" -nohome
MozillaE:\PROGRA~1\MOZILLA.ORG\MOZILLA\MOZILLA.EXE -url "%1"
Opera"E:\Program Files\Opera7\opera.exe"

Вот на что следует обратить внимание:

  • Там все-таки есть нужный нам путь
  • В начале строки иногда стоят кавычки
  • В конце записан какой-то мусор (естественно, для нас)

Предлагаю вам следующий код, чтобы определить, какой же браузер все-таки выбран по-умолчанию (для протокола http).

TCHAR buf[256];
HKEY hKey;
int i;
DWORD Size = 256;
int pos;
int len;
TCHAR *EXE = ".exe";

RegOpenKeyEx (HKEY_CLASSES_ROOT, _TEXT("http\\shell\\open\\command"),
                                                 0, KEY_QUERY_VALUE, &hKey);
RegQueryValueEx (hKey, NULL, NULL, NULL, (LPBYTE)buf, &Size);
RegCloseKey (hKey);

// Отрежем то, что после пути с именем
// Найдем, где кончается путь
if (buf[0] == _TEXT('\"'))
{
        lstrcpy (Browser, &buf[1]);
}
else
{
        lstrcpy (Browser, buf);
}

len = lstrlen (Browser);
pos = len - 4;
for (i = 0; i < len - 3; i++)
{
        if (!strnicmp (&Browser[i], EXE, 4))
        {
                pos = i;
                break;
        }
}
Browser[pos + 4] = _TEXT('\0');

Здесь будем считать, что строка Browser глобальная. И после этого смело можно ставить код наподобие следующего:

ShellExecute (HWND_DESKTOP, _TEXT("open"), Browser,
                        _TEXT("http://www.microsoft.com"), NULL, SW_SHOWNORMAL);

ShellExecute (HWND_DESKTOP, _TEXT("open"), Browser,
                        _TEXT("http://jenyay.net"), NULL, SW_SHOWNORMAL);

ShellExecute (HWND_DESKTOP, _TEXT("open"), Browser,
                        _TEXT("http://www.rsdn.ru"), NULL, SW_SHOWNORMAL);

И эти ссылки будут гарантировано открыты в отдельных окнах.

Немного рекламы

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
4 stars

Рейтинг 3.6/5. Всего 28 голос(а, ов)



Линда Кайе 20.11.2007 - 21:44

А в качестве Verb не получится использовать opennew? Для IE работать должно, а вот с остальными точно не знаю.

Jenyay 21.11.2007 - 09:48

Если честно, я так давно с этим разбирался, что уже и не помню, пробовал так делать или нет. Хотя попробовать можно.

 18.11.2009 - 22:08

как открыть свой браузер?

как открыть свой браузер?angry smiley

Yachiru 12.01.2010 - 06:00

angry smileyмля, чёт нехера не понятна в этой статье...ппц что за "код" куда его вставлять надо?

Yachiru 12.01.2010 - 06:01

angry smiley

Jenyay 12.01.2010 - 09:31

Вставлять надо в компилятор на C++ :)

Пайд 26.03.2011 - 23:53

    Нихрена не понял

233 25.04.2011 - 11:40

статья неуд.


Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 535