Как открыть ссылку в новом окне браузера
В чем суть проблемы
На форумах часто попадается вопрос типа: "Как можно открыть ссылку в новом окне браузера". Причем надо заметить, что это вопрос по программированию под 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, я наткнулся на следующую таблицу:
-channelband | Internet Explorer as a Desktop Toolbar, displaying the Channels Directory of the currently logged on user. This option only applies when Active Desktop is off. |
-e | Launch Internet Explorer in Explorer mode (standard two pane view, My Computer on left, Content on right) |
-new | Start up Internet Explorer in a separate process. |
-nohome | Open Internet Explorer and don't open any Web page at all. |
-k | Launch 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 |
Mozilla | E:\PROGRA~1\MOZILLA.ORG\MOZILLA\MOZILLA.EXE -url "%1" |
Opera | "E:\Program Files\Opera7\opera.exe" |
Вот на что следует обратить внимание:
- Там все-таки есть нужный нам путь
- В начале строки иногда стоят кавычки
- В конце записан какой-то мусор (естественно, для нас)
Предлагаю вам следующий код, чтобы определить, какой же браузер все-таки выбран по-умолчанию (для протокола http).
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 глобальная. И после этого смело можно ставить код наподобие следующего:
_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.