首页 > 解决方案 > WIN32 - 同步创建 WebView2 不起作用 - 我的集成 Web 浏览器没有白色矩形

问题描述

简而言之,我向您解释我的问题。在我的应用程序中,我有一个加载浏览器的按钮。当我单击该按钮时,它会打开并很好地创建 webBrowser(白色矩形)。

但是,当我通过事件 WM_SHOWWINDOW 打开应用程序的窗口(包含不同的组件:按钮、edittext 等)时尝试创建 Web 浏览器时,如果我发表评论,我看不到我的 Web 浏览器除外构造函数 EdgeBrowser 中的所有循环“while”。

为什么 ?你能给我一个解决方案吗?这将是友好的。

我创建了一个带有构造函数的类 EdgeBrowser,该构造函数接收我的 WIN32 组件(HWND 组件)的句柄。在我的构造函数中,我做了类似的事情:

EdgeBrowser::EdgeBrowser(HWND hwnd)
{
      _hwnd = hwnd;
      EdgeBrowser::_beginAsyncOperation = true;
      this->CreateWebView();
      
      while (EdgeBrowser::_beginAsyncOperation)
      {
             Sleep(10);
             MSG msg;
             for (int nmsg = 0; nmsg < 50; ++nmsg)
             {
                    int rc = PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);

                    if (rc == 0)
                    {
                           break;
                    }
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
             }
      }
}

在我的“CreateWebView”函数的一部分中,不同的侦听器:

void EdgeBrowser::CreateWebView 
{
          // other code
          HRESULT hr = CreateCoreWebView2EnvironmentWithOptions(nullptr, userDataDir.c_str(),nullptr,Microsoft::WRL::Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>(this,&EdgeBrowser::OnCreateCoreWebView2EnvironmentCompletedHandler).Get()); 
}

HRESULT EdgeBrowser::OnEnvironmentReadyCompletedHandler(HRESULT result, ICoreWebView2Environment* env)
{
HRESULT createBrowserControlsResult = m_uiEnv->CreateCoreWebView2Controller(this->_thisHandler, Microsoft::WRL::Callback<ICoreWebView2CreateCoreWebView2ControllerCompletedHandler>(this,&EdgeBrowser::OnCreateCoreWebView2ControllerCompletedHandler).Get());
          
HRESULT createBrowserOptionsResult = m_uiEnv->CreateCoreWebView2Controller(this->_thisHandler,Microsoft::WRL::Callback<ICoreWebView2CreateCoreWebView2ControllerCompletedHandler>( this,&EdgeBrowser::OnCreateCoreWebView2ControllerOptionsCompletedHandler).Get());
}

HRESULT EdgeBrowser::OnCreateCoreWebView2ControllerOptionsCompletedHandler(HRESULT result, ICoreWebView2Controller* host)
{
       m_optionsController = host;
       HRESULT getOptWebViewResult = m_optionsController->get_CoreWebView2(&m_optionsWebView);
       
       //other code
       EdgeBrowser::_beginAsyncOperation = false;
       return S_OK;
}

标签: c++comwebview2

解决方案


WebView2 控件需要在创建它的 UI 线程上运行消息循环(有关WebView2 线程的更多信息,请参阅此页面)。您可以将WebView2APISample 示例应用程序视为基于示例 C++ Win32 HWND 的应用程序。


推荐阅读