WebView2 複数プロファイル API を使用すると、ユーザー プロファイルを作成して操作して、WebView2 コントロールを操作できます。 WebView2 のプロファイルは、概念的には Microsoft Edge のプロファイルと似ています。 複数のプロファイルのサポートにより、WebView2 アプリは 1 つのユーザー データ フォルダーの下に複数のプロファイルを持つことができます。
各プロファイルには、ブラウザー データを保存するための専用プロファイル フォルダーがあり、Cookie、ユーザー設定、キャッシュされたリソースなど、ユーザーごとに個別の閲覧データ ストレージが提供されます。 同じユーザー プロファイルに関連付けられているすべての WebView2 コントロールは、1 つのプロファイル フォルダーを共有します。
前の方法: WebView2 コントロールごとに異なるユーザー データ フォルダーを使用する
以前は、複数プロファイルのサポートがなければ、データの分離を実現するために、WebView2 アプリでは、WebView2 コントロールごとに異なるユーザー データ フォルダーを使用できました。 ただし、この方法では、複数の WebView2 ランタイム インスタンス (ブラウザー プロセスと子プロセスの束を含む) を実行する必要があります。これにより、メモリ、CPU フットプリント、ディスク領域など、より多くのシステム リソースが消費されました。
WebView2 の作成時にプロファイルを指定する
プロファイルを定義する options オブジェクトを作成する
の CoreWebView2Environment
メソッドはCreateCoreWebView2ControllerOptions
、 CoreWebView2ControllerOptions
などのプロファイルProfileName
IsInPrivateModeEnabled
に関する特定の情報を提供する options オブジェクト を作成します。 このオブジェクトを使用して、WebView2 コントロール インスタンスを作成するときにターゲット プロファイルを指定します。
プロファイルを使用する WebView2 コントロールを作成する
パラメーターを受け取る各 Create...Controller
メソッドは options
、WebView2 コントロールを作成し、指定したプロファイルに関連付けます。 指定したプロファイルが存在しない場合は、新しいプロファイルが作成されます。
WebView2 の作成時にプロファイルを指定する例
public async void CreateWebView2Controller(object sender, RoutedEventArgs e)
{
var hwnd = new HwndForWV2();
Window window = new Window();
window.Content = hwnd;
window.Show();
var env = await CoreWebView2Environment.CreateAsync();
var options = env.CreateCoreWebView2ControllerOptions();
options.ProfileName = "MyProfile";
options.IsInPrivateModeEnabled = true;
var controller = await env.CreateCoreWebView2ControllerAsync(hwnd.Handle, options);
controller.Bounds = new System.Drawing.Rectangle(0, 0, 800, 600);
controller.CoreWebView2.Navigate("https://www.bing.com/");
controller.CoreWebView2.NavigationStarting += CoreWebView_NavigationStarting;
}
public async Task InitializeCoreWebView2()
{
CoreWindow coreWindow = Windows.UI.Core.CoreWindow.GetForCurrentThread();
CoreWebView2Environment env = await CoreWebView2Environment.CreateAsync();
CoreWebView2ControllerWindowReference windowReference = CoreWebView2ControllerWindowReference.CreateFromCoreWindow(coreWindow);
CoreWebView2ControllerOptions options = env.CreateCoreWebView2ControllerOptions();
options.ProfileName = "MyProfile";
options.IsInPrivateModeEnabled = true;
CoreWebView2Controller controller = await env.CreateCoreWebView2ControllerAsync(windowReference, options);
controller.CoreWebView2.NavigationStarting += WebView2_NavigationStarting;
controller.CoreWebView2.Navigate("https://www.bing.com");
}
HRESULT AppWindow::CreateControllerWithOptions()
{
auto webViewEnvironment10 = m_webViewEnvironment.try_query<ICoreWebView2Environment10>();
if (!webViewEnvironment10)
{
FeatureNotAvailable();
return S_OK;
}
wil::com_ptr<ICoreWebView2ControllerOptions> options;
// The validation of parameters occurs when setting the properties.
HRESULT hr = webViewEnvironment10->CreateCoreWebView2ControllerOptions(&options);
if (hr == E_INVALIDARG)
{
ShowFailure(hr, L"Unable to create WebView2 due to an invalid profile name.");
CloseAppWindow();
return S_OK;
}
CHECK_FAILURE(hr);
// If call 'put_ProfileName' with an invalid profile name, the 'E_INVALIDARG' returned
// immediately. ProfileName could be reused.
CHECK_FAILURE(options->put_ProfileName(m_webviewOption.profile.c_str()));
CHECK_FAILURE(options->put_IsInPrivateModeEnabled(m_webviewOption.isInPrivate));
#ifdef USE_WEBVIEW2_WIN10
if (m_dcompDevice || m_wincompCompositor)
#else
if (m_dcompDevice)
#endif
{
CHECK_FAILURE(webViewEnvironment10->CreateCoreWebView2CompositionControllerWithOptions(
m_mainWindow, options.get(),
Callback<ICoreWebView2CreateCoreWebView2CompositionControllerCompletedHandler>(
[this](
HRESULT result,
ICoreWebView2CompositionController* compositionController) -> HRESULT {
auto controller =
wil::com_ptr<ICoreWebView2CompositionController>(compositionController)
.query<ICoreWebView2Controller>();
return OnCreateCoreWebView2ControllerCompleted(result, controller.get());
})
.Get()));
}
else
{
CHECK_FAILURE(webViewEnvironment10->CreateCoreWebView2ControllerWithOptions(
m_mainWindow, options.get(),
Callback<ICoreWebView2CreateCoreWebView2ControllerCompletedHandler>(
this, &AppWindow::OnCreateCoreWebView2ControllerCompleted)
.Get()));
}
return S_OK;
}
プロファイルにアクセスして操作する
プロファイル オブジェクトを取得するには、WebView2 コントロールの プロパティにアクセス Profile
します。
プロファイル オブジェクトを取得したら、それを操作できます。 プロファイル情報を取得し、プロファイル全体の設定と操作を行う場合に使用 CoreWebView2Profile
します。
プロファイルへのアクセスと操作の例
string profileName = controller.CoreWebView2.Profile.ProfileName;
bool inPrivate = controller.CoreWebView2.Profile.IsInPrivateModeEnabled;
// update window title with profileName
UpdateAppTitle(profileName);
// update window icon
SetAppIcon(inPrivate);
string profileName = controller.CoreWebView2.Profile.ProfileName;
bool inPrivate = controller.CoreWebView2.Profile.IsInPrivateModeEnabled;
// update window title with profileName
UpdateAppTitle(profileName);
// update window icon
SetAppIcon(inPrivate);
// This is the callback passed to CreateCoreWebView2Controller.
// Here we can get the profile property of the WebView2 control, then manipulate it.
HRESULT AppWindow::OnCreateCoreWebView2ControllerCompleted(HRESULT result, ICoreWebView2Controller* controller)
{
// ...
m_controller = controller;
wil::com_ptr<ICoreWebView2> coreWebView2;
CHECK_FAILURE(m_controller->get_CoreWebView2(&coreWebView2));
// We should check for failure here because if this app is using a newer
// SDK version compared to the install of the Edge browser, the Edge
// browser might not have support for the latest version of the
// ICoreWebView2_N interface.
coreWebView2.query_to(&m_webView);
// Save PID of the browser process serving last WebView created from our
// CoreWebView2Environment. We know the controller was created with
// S_OK, and it hasn't been closed (we haven't called Close and no
// ProcessFailed event could have been raised yet) so the PID is
// available.
CHECK_FAILURE(m_webView->get_BrowserProcessId(&m_newestBrowserPid));
auto webView2_13 = coreWebView2.try_query<ICoreWebView2_13>();
if (webView2_13)
{
wil::com_ptr<ICoreWebView2Profile> profile;
CHECK_FAILURE(webView2_13->get_Profile(&profile));
wil::unique_cotaskmem_string profile_name;
CHECK_FAILURE(profile->get_ProfileName(&profile_name));
m_profileName = profile_name.get();
BOOL inPrivate = FALSE;
CHECK_FAILURE(profile->get_IsInPrivateModeEnabled(&inPrivate));
if (!m_webviewOption.downloadPath.empty())
{
CHECK_FAILURE(profile->put_DefaultDownloadFolderPath(
m_webviewOption.downloadPath.c_str()));
}
// update window title with m_profileName
UpdateAppTitle();
// update window icon
SetAppIcon(inPrivate);
}
// ...
}
関連項目