ShellExecute зависает, открывая новое окно браузера, если по умолчанию Chrome или IE
Я использовал этот код (из MSDN), чтобы открыть браузер по умолчанию.
Private Declare Function ShellExecute _
Lib "shell32.dll" _
Alias "ShellExecuteA"( _
ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) _
As Long
Private Sub Command1_Click()
Dim r As Long
r = ShellExecute(0, "open", "http://www.microsoft.com", 0, 0, 1)
End Sub
Он отлично работает для IE и Chrome, только если экземпляр уже открыт, затем он просто рекламирует вкладку и возвращает запрошенную страницу.
Если экземпляр еще не открыт, создается новый, но страница не загружается и время ожидания истекает.
Кажется, только firefox работает нормально в обоих сценариях.
Затем я попробовал методику (подробно здесь), где я создал временный htm-файл, чтобы найти связанное приложение с целью последующего использования с помощью одного из вызовов оболочки ниже:
Shell "C:\Program Files\Internet Explorer\iexplore.exe https://www.google.co.uk/", vbNormalFocus
Shell "C:\Program Files\Mozilla Firefox\firefox.exe https://www.google.co.uk/", vbNormalFocus
Shell "C:\Users\Kjack\AppData\Local\Google\Chrome\Application\chrome.exe https://www.google.co.uk/", vbNormalFocus
На этот раз FF и IE работали, но у Chrome все еще была та же проблема.
Кто-нибудь знает решение этой проблемы?
РЕДАКТИРОВАТЬ, чтобы добавить информацию о ОС и версиях браузера:
ОС: Windows Vista Home Basic 32-разрядная
FireFox 20.0.1
IE 9.0.8112.16421
Опера 12.15 Сборка 1748
Хром 26.0.1410.64 м
3 ответа
С тех пор, как появилась Win2k & Me, у вас также есть чистый COM-интерфейс для этого. Он предлагает поддержку Unicode без вращения:
With CreateObject("Shell.Application")
.ShellExecute "http://www.microsoft.com"
End With
Этот пример позволяет всем необязательным параметрам (включая глагол) по умолчанию. Как уже указывалось в ответе Кена Уайта, в этом случае вы хотите, чтобы глагол использовался по умолчанию.
Ваш код предполагает, что существует open
глагол, присвоенный http:
протокол, и нет никаких гарантий, что это было сделано при установке браузера.
Вместо этого просто оставьте глагол пустым. Если вы не укажете один из них, Windows будет использовать любое действие по умолчанию для протокола или ассоциации файлов.
Private Sub Command1_Click()
Dim r As Long
r = ShellExecute(0, "", "http://www.microsoft.com", 0, 0, 1)
End Sub
Подсказка. Чтобы узнать, какое действие по умолчанию применяется к файлу, щелкните его правой кнопкой мыши в проводнике Windows. Действие по умолчанию - это то, что вверху контекстного меню отображается жирным шрифтом.
Откроется браузер по умолчанию (например, Chrome) без зависания:
VB6:
Call Shell("explorer """ & sURL & """", vbNormalFocus)
Или попробуйте это:
Dim objShell As Object
Set objShell = CreateObject("WScript.Shell")
Call objShell.Run("explorer """ & sURL & """", vbNormalFocus)