如何使用 C++ 代码中的特定 URL 启动 Microsoft Edge

Posted

技术标签:

【中文标题】如何使用 C++ 代码中的特定 URL 启动 Microsoft Edge【英文标题】:How to start Microsoft Edge with specific URL from C++ code 【发布时间】:2016-01-28 19:06:59 【问题描述】:

我尝试了Launching Microsoft Edge with URL from code 和How to open URL in Microsoft Edge from the command line? 中的解决方案,但它们对我不起作用。

这是我的代码:

    std::string url = "http://www.test.com";
    std::wstring quotedArg = L"microsoft-edge:\"" + url + L"\"";
    std::vector<WCHAR> argBuff(quotedArg.w_size() + 1);
    wcscpy_s(&argBuff[0], argBuff.size(), quotedArg.w_str());

    STARTUPINFO si = 0;
    PROCESS_INFORMATION pi = 0;
    si.cb = sizeof si;
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_SHOWNORMAL;

    if (!CreateProcess(L"start", &argBuff[0], NULL, NULL, FALSE,
                       0, NULL, NULL, &si, &pi)) 
       DWORD error = GetLastError(); // here error = 2
       return false;
    

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

CreateProcess()后面的错误码是2,在https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382%28v=vs.85%29.aspx中代表ERROR_FILE_NOT_FOUND


更新 1: 对于 Dúthomhas 的问题: 我没有将用户与 Edge 绑定。我使用ShellExecuteEx() 打开http/https URL,如下sn-p。

    SHELLEXECUTEINFO sei =  ;
    sei.cbSize = sizeof sei;
    sei.nShow = SW_SHOWNORMAL;
    sei.lpFile = url.w_str();
    sei.lpVerb = L"open";

    sei.fMask = SEE_MASK_CLASSNAME;

    sei.lpClass = url.startsWith("https:")
                  ? L"https"
                  : L"http";

    if (ShellExecuteEx(&sei)) 
       return true;
    

但这不适用于 Microsoft Edge,并且会弹出错误对话框提示

&lt;URL&gt; The specified module could not be found.


更新 2:

按照Dúthom的建议将cmd /C start的完整路径放入CreateProcess(),使调用成功,

    wui::string quotedArg = L"/C start microsoft-edge:" + url;
    std::vector<WCHAR> argBuf(quotedArg.w_size() + 1);
    wcscpy_s(&argBuf[0], argBuf.size(), quotedArg.w_str());
    CreateProcess(L"C:\\Windows\\System32\\cmd.exe", &argBuf[0], NULL, 
                  NULL, FALSE, 0, NULL, NULL, &si, &pi)

但结果是没有打开浏览器并显示弹出对话框

microsoft-edge:&lt;UR&gt; The specified module could not be found.

【问题讨论】:

@david-heffernan 这不是“如何从命令行在 Microsoft Edge 中打开 URL”的副本,因为该答案中的解决方案在这里不起作用。 这不是重复的工作方式。大概你只需要使用ShellExecuteEx 【参考方案1】:

您正在做一些奇怪的事情,例如使用 std::vector 而不是直接的 std::wstring。 (可以将 .c_str() 传递给这样的函数。)

在任何情况下,请务必阅读 CreateProcess 等函数的文档。

您必须为您的流程提供完整的命令行,而不仅仅是片段。没有名为“start”的可执行文件——它是 cmd.exe 的子命令。因此,如果您使用 CreateProcess,您还必须提供完整、真实的命令行:

C:\Windows\System32\cmd.exe /C start microsoft-edge:http://www.test.com

不过,大家都说真的不应该让你的用户指定他应该使用哪个浏览器。您的用户选择了默认浏览器,因为那是他希望使用的浏览器。当你颠覆这个选择并启动不同的浏览器时,他会讨厌你的软件。

[编辑] 好吧,我没有安装 Windows 10,所以我没有弄乱 Edge,但它 appears that MS has not given it the standard command-line abilities。我无法理解为什么。

尽管如此,您可能必须坚持使用“启动”命令“协议”,使用更新 2 使用的方法,只需省略“microsoft-edge”部分。

我可以建议的唯一其他方法(我对 Windows 10 的了解不够,无法说这必然是唯一正确的方法)是查看注册表以查看是否安装了 edge,然后启动浏览器用正确的方法。

唉。

【讨论】:

不,将常量缓冲区传递给 CreateProcess 的第二个参数确实不行。阅读文档。 不,传递它真的可以的,因为缓冲区保证是你的 C++11 标准可以修改。阅读文档。 没有。 c_str 返回一个指向不可修改缓冲区的指针,const char*const wchar_t* 问题区提供的更新。 可能你不知道const是什么意思【参考方案2】:

据我所知,你正在制造相当恶劣的天气。当然,它并不像看起来那么复杂。以下代码会打开一个 Edge 窗口,并导航到所需的站点:

#include <Windows.h>

int main()

    CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);

    SHELLEXECUTEINFOW sei =  sizeof sei ;
    sei.lpVerb = L"open";
    sei.lpFile = L"microsoft-edge:http://www.***.com";
    ShellExecuteExW(&sei);

我怀疑你把你的报价弄得一团糟。

【讨论】:

我试过你的程序,它会弹出一个错误对话框,标题为“microsoft-edge:***.com”,内容为“此文件没有与之关联的程序来执行此操作。请安装一个程序,或者如果已经安装了一个程序,请在默认程序控制面板中创建一个关联。”我在控制面板中检查了“默认程序”,并在 Microsoft Edge 配置中选择了“将此程序设置为默认程序”,这没有区别。顺便说一句,我的操作系统是 Windows Server 2016。 它在这里工作。我正在使用 Windows 10 标记问题。 让我找个 Win 10 测试一下,稍后再报告结果。 OK 你的代码在我的 Win 10 测试中工作。所以在 Windows Server 2016 中启动 Edge 的方式与我想的 Windows 10 中的方式不一样。无论如何,感谢您的帮助! 你标记了问题 windows-10

以上是关于如何使用 C++ 代码中的特定 URL 启动 Microsoft Edge的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 启动具有特定 URL 的 Google Chrome 选项卡

如何使用特定符号 C++ 查找和替换字符串中的所有字符

如何创建仅允许访问 C++ 中的特定用户帐户的手动重置事件?

如何删除 C++ 给定矩阵中的特定行和列?

如何在 MI 4i 安全应用程序中以编程方式为我的应用程序启用自动启动选项?

如何仅刷新DEFAULT浏览器中的特定选项卡,其他选项卡不应刷新