如何使用C++代码中的特定URL启动Microsoft Edge
How to start Microsoft Edge with specific URL from C++ code
我尝试了用代码中的URL启动Microsoft Edge和如何从命令行在Microsoft Edge中打开URL中的解决方案?但它们对我不起作用。
这是我的代码:
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代表CCD_ 2。
更新1:对于Dúthomhas的问题:我不会将用户与Edge绑定。我使用ShellExecuteEx()
来打开http/https URL,如下所示。
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不起作用,并将弹出错误对话框,显示
<URL> The specified module could not be found
。
更新2:
按照Dúthomhas的建议,将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:<UR> The specified module could not be found
。
据我所见,你的天气相当恶劣。当然,这并不像看上去那么复杂。以下代码将显示一个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.stackoverflow.com";
ShellExecuteExW(&sei);
}
我怀疑你的报价是一团糟。
您正在做一些奇怪的事情,比如使用std::vector而不是直接的std::wstring。(可以将.c_str()传递给这样的函数。)
在任何情况下,请务必阅读CreateProcess等函数的文档。
您必须为您的流程提供完整的命令行,而不仅仅是片段。没有名为"start"的可执行文件--它是cmd.exe的子命令。因此,如果使用CreateProcess,则还必须提供完整的、真实的命令行:
C:WindowsSystem32cmd.exe /C start microsoft-edge:http://www.test.com
然而,所有人都说,你真的不应该向用户口述他应该使用哪个浏览器。您的用户选择了默认浏览器,因为这是他希望使用的浏览器。当你颠覆了这个选择,推出了一个不同的浏览器时,他会讨厌你的软件。
[编辑]嗯,我没有安装Windows 10,所以我没有摆弄Edge,但MS似乎没有赋予它标准的命令行功能。我无法理解为什么。
尽管如此,看起来你可能不得不坚持"启动"命令"协议",使用Update2使用的方法,只需省略"microsoft edge"部分。
我唯一能建议的其他方法(我对Windows 10的了解还不够,不能说这一定是唯一正确的方法)是查看注册表,看看是否安装了edge,然后用正确的方法启动浏览器。
唉。
- 如何创建一个空的全局类并在启动时实例化它
- 即使我读取了所有内容,在FIFO上打开的QSocketNotifier也会一直启动
- 如何使用url确定网站协议
- 下载URL中的所有文件
- 使用 std::string () const 函数启动线程或未来
- 使用libcurl提交批量url的正确BING Api POST url是什么
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- 如何创建线程序列以按照启动顺序执行任务?
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 在挂钩启动新线程时解除挂钩进程
- 程序无法启动,因为缺少 libmpc-3.dll
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- QSerialPort 在应用程序启动之前正在使用中
- 无法在 Arch Linux 中启动虚幻引擎 4
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 如何启动文件/目录/URL的关联应用程序
- 如何在同一选项卡中启动 URL
- 如何使用C++代码中的特定URL启动Microsoft Edge
- 使用CreateProcessAsUser来启动url