|
В чем суть проблемыНа форумах часто попадается вопрос типа: "Как можно открыть ссылку в новом окне браузера". Причем надо заметить, что это вопрос по программированию под 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, я наткнулся на следующую таблицу:
Причем эта таблица относится еще к IE 4.0. Казалось бы на этом можно было бы и остановиться, но, как оказывается, нам это абсолютно ничем не поможет. И вот почему.
После долгих экспериментов оказалось, что все решается намного проще (на первый взгляд). Достаточно написать следующую строку. ShellExecute (HWND_DESKTOP, _TEXT("open"), Browser, Url, NULL, SW_SHOWNORMAL); Как определить браузер по-умолчанию.Здесь надо предостеречь от частой ошибки. Часто счтитают, что браузер по-умолчанию, это та программа, которая открывает файлы формата html и смотрят в реестре программу, которая зарагистрировано на расширение html и ее используют. А в MSDN вообще был пример, который создавал файл html и функцией FindExecutable определяли, какой программой он откроется. Это в корне неправильно. И вот почему. Можно открывать у себя с харда html-файлы одним браузером, а открывать адреса другим. Например, файлы я читаю Оперой, а в Инете сижу под Мозиллой. Заблуждение, может быть, возникло из-за того, что если в IE поставить его как браузер по-умолчанию, то он будет и для сайтов и для файлов. Как поется у Арии "Мир обречен, выбора нет". А нам этот выбор нужен. Поэтому в Мозилле и в Опере можно выбирать, для чего использовать данный браузер, вплоть до протоколов. Так как же быть. А вот как. Надо прочитать значение из реестра по следующему пути: HKEY_CLASSES_ROOT\http\shell\open\command. И уже из этой строки "выудить" путь к браузеру. Именно "выудить", так как каждый браузер пишет туда все, что хочет. Вот вам таблица (обратите внимание на кавычки.
Вот на что следует обратить внимание:
Предлагаю вам следующий код, чтобы определить, какой же браузер все-таки выбран по-умолчанию (для протокола 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); И эти ссылки будут гарантировано открыты в отдельных окнах.
Пожалуйста, оцените материал
|