forked from metin-server/m2dev-client-src
WebView2 added as embedded browser
This commit is contained in:
@@ -1,46 +1,123 @@
|
||||
#include "StdAfx.h"
|
||||
#include "PythonApplication.h"
|
||||
#include "../CWebBrowser/CWebBrowser.h"
|
||||
|
||||
#undef C8
|
||||
#include <wrl.h>
|
||||
#include <wil/com.h>
|
||||
#include <WebView2.h>
|
||||
#include <WebView2EnvironmentOptions.h>
|
||||
|
||||
#include <shlobj.h>
|
||||
#include <filesystem>
|
||||
#include <locale>
|
||||
#include <codecvt>
|
||||
|
||||
static wil::com_ptr<ICoreWebView2> gs_webView;
|
||||
static wil::com_ptr<ICoreWebView2Controller> gs_webViewController;
|
||||
|
||||
using convert_type = std::codecvt_utf8<wchar_t>;
|
||||
static std::wstring_convert<convert_type, wchar_t> converter;
|
||||
|
||||
bool CPythonApplication::IsWebPageMode()
|
||||
{
|
||||
return WebBrowser_IsVisible() ? true : false;
|
||||
return gs_webViewController.get();
|
||||
}
|
||||
|
||||
void CPythonApplication::ShowWebPage(const char* c_szURL, const RECT& c_rcWebPage)
|
||||
{
|
||||
if (WebBrowser_IsVisible())
|
||||
return;
|
||||
SetCursorMode(CURSOR_MODE_HARDWARE);
|
||||
|
||||
m_grpDevice.EnableWebBrowserMode(c_rcWebPage);
|
||||
if (!WebBrowser_Show(GetWindowHandle(), c_szURL, &c_rcWebPage))
|
||||
PWSTR path_tmp;
|
||||
SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, nullptr, &path_tmp);
|
||||
|
||||
std::filesystem::path tempPath = std::filesystem::temp_directory_path();
|
||||
tempPath /= "Metin2";
|
||||
tempPath /= "WebCache";
|
||||
|
||||
auto options = Microsoft::WRL::Make<CoreWebView2EnvironmentOptions>();
|
||||
{
|
||||
TraceError("CREATE_WEBBROWSER_ERROR:%d", GetLastError());
|
||||
Microsoft::WRL::ComPtr<ICoreWebView2EnvironmentOptions6> options6;
|
||||
if (options.As(&options6) == S_OK) {
|
||||
options6->put_AreBrowserExtensionsEnabled(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
SetCursorMode(CURSOR_MODE_HARDWARE);
|
||||
std::wstring stURL = converter.from_bytes(c_szURL);
|
||||
CreateCoreWebView2EnvironmentWithOptions(nullptr, tempPath.c_str(), options.Get(),
|
||||
Microsoft::WRL::Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>(
|
||||
[handle = GetWindowHandle(), stURL, myRect = c_rcWebPage](HRESULT result, ICoreWebView2Environment* env) -> HRESULT {
|
||||
|
||||
// Create a CoreWebView2Controller and get the associated CoreWebView2 whose parent is the main window hWnd
|
||||
env->CreateCoreWebView2Controller(handle, Microsoft::WRL::Callback<ICoreWebView2CreateCoreWebView2ControllerCompletedHandler>(
|
||||
[stURL, myRect](HRESULT result, ICoreWebView2Controller* controller) -> HRESULT {
|
||||
if (controller != nullptr) {
|
||||
gs_webViewController = controller;
|
||||
gs_webViewController->get_CoreWebView2(&gs_webView);
|
||||
}
|
||||
if (!gs_webView) {
|
||||
TraceError("failed to get controller for webview, result: 0x%X", result);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Add a few settings for the webview
|
||||
// The demo step is redundant since the values are the default settings
|
||||
#ifdef _LIVE
|
||||
wil::com_ptr<ICoreWebView2Settings> baseSettings;
|
||||
gs_webView->get_Settings(&baseSettings);
|
||||
|
||||
auto settings = baseSettings.try_query< ICoreWebView2Settings3>();
|
||||
if (settings) {
|
||||
settings->put_AreDevToolsEnabled(FALSE);
|
||||
settings->put_AreDefaultContextMenusEnabled(FALSE);
|
||||
settings->put_AreBrowserAcceleratorKeysEnabled(FALSE);
|
||||
settings->put_IsZoomControlEnabled(FALSE);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Resize WebView to fit the bounds of the parent window
|
||||
gs_webViewController->put_Bounds(myRect);
|
||||
|
||||
// Schedule an async task to navigate to Bing
|
||||
gs_webView->Navigate(stURL.c_str());
|
||||
|
||||
// <NavigationEvents>
|
||||
// Step 4 - Navigation events
|
||||
// register an ICoreWebView2NavigationStartingEventHandler to cancel any non-https navigation
|
||||
EventRegistrationToken token;
|
||||
gs_webView->add_NavigationStarting(Microsoft::WRL::Callback<ICoreWebView2NavigationStartingEventHandler>(
|
||||
[](ICoreWebView2* gs_webView, ICoreWebView2NavigationStartingEventArgs* args) -> HRESULT {
|
||||
wil::unique_cotaskmem_string uri;
|
||||
args->get_Uri(&uri);
|
||||
std::wstring source(uri.get());
|
||||
if (source.substr(0, 5) != L"https") {
|
||||
args->put_Cancel(TRUE);
|
||||
}
|
||||
return S_OK;
|
||||
}).Get(), &token);
|
||||
// </NavigationEvents>
|
||||
|
||||
return S_OK;
|
||||
}).Get());
|
||||
return S_OK;
|
||||
}).Get());
|
||||
}
|
||||
|
||||
void CPythonApplication::MoveWebPage(const RECT& c_rcWebPage)
|
||||
{
|
||||
if (WebBrowser_IsVisible())
|
||||
{
|
||||
m_grpDevice.MoveWebBrowserRect(c_rcWebPage);
|
||||
WebBrowser_Move(&c_rcWebPage);
|
||||
}
|
||||
if (gs_webViewController)
|
||||
gs_webViewController->put_Bounds(c_rcWebPage);
|
||||
}
|
||||
|
||||
void CPythonApplication::HideWebPage()
|
||||
{
|
||||
if (WebBrowser_IsVisible())
|
||||
{
|
||||
WebBrowser_Hide();
|
||||
if (gs_webView)
|
||||
gs_webView.reset();
|
||||
|
||||
m_grpDevice.DisableWebBrowserMode();
|
||||
if (gs_webViewController)
|
||||
gs_webViewController.reset();
|
||||
|
||||
if (m_pySystem.IsSoftwareCursor())
|
||||
SetCursorMode(CURSOR_MODE_SOFTWARE);
|
||||
else
|
||||
SetCursorMode(CURSOR_MODE_HARDWARE);
|
||||
}
|
||||
if (m_pySystem.IsSoftwareCursor())
|
||||
SetCursorMode(CURSOR_MODE_SOFTWARE);
|
||||
else
|
||||
SetCursorMode(CURSOR_MODE_HARDWARE);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user