【问题标题】:show webview/webpage window in c++ windows desktop application在 c++ windows 桌面应用程序中显示 webview/网页窗口
【发布时间】:2020-05-03 13:28:15
【问题描述】:

我想在 c++ windows 应用程序中显示弹出窗口/通知。通知将显示我们网站的网页。我正在寻找类似于 CEF 但本机 OS API 来显示 webview 内容的东西。也许有一些类可以与 CreateWindowEx 一起使用?

【问题讨论】:

  • 没有可以通过 CreateWindowEx 创建的 Web 浏览器窗口。您可以将 IE 控件与 Windows 原生的 ActiveX 一起使用。但是在使用 IE 控件之前我会三思而后行,因为浏览器已被 Microsoft 弃用。或者你可以使用 CEF。
  • @armagedescu 我曾想过使用 CEF,但它对我们的项目来说太重了。我们只需要显示一个简单的静态网页。我读到 MFC 应用程序中的浏览器控制,这也贬值了吗?
  • 它不是一个像你可以用 CreateWindowEx 例程创建的窗口类。它是一个 ActiveX 控件,它是同一个 Internet Explorer。你可以在 ATL 中做到这一点。
  • 查看我的回答,了解如何使用 ATL 和 Web 浏览器控件。

标签: c++ webview chromium-embedded iwebbrowser2


【解决方案1】:
  1. 创建一个空的 C++ 项目
  2. 创建资源对话框。右键单击对话框并添加一个 ActiveX->Microsoft Web 浏览器控件。调整它的大小,然后移动到正确的位置。更改 ID,以便您可以在程序中识别它
  3. 添加内容相似的 C++ 文件:
//#import 
#include <Windows.h>
#include <Ole2.h>
#include "resource.h"
#include <iostream>
#include <atlbase.h> //activex
#include <atlwin.h> //windows
#include <atlcom.h>

//This will load the browser dll then library and will generate headers
//All the declarations will be in the namespace SHDocVw
#import "shdocvw.dll"
using namespace std;

class CMyDialog : public CAxDialogImpl<CMyDialog>
{
public:
    enum { IDD = IDD_DIALOG_COM};

    BEGIN_MSG_MAP(CMyDialog)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
        COMMAND_HANDLER(IDCANCEL, BN_CLICKED, OnBnCancel)
        COMMAND_HANDLER(IDOK, BN_CLICKED, OnBnOk)
    END_MSG_MAP()
    CComPtr<SHDocVw::IWebBrowser2>  ctrl;
    LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        // Do some initialization code
        HRESULT hr;
        //IDC_EXPLORER_TEST is the ID of your control
        GetDlgControl(IDC_EXPLORER_TEST, __uuidof(ctrl), (void**)&ctrl);

        _variant_t address = L"google.com";
        //open a web page
        hr = ctrl->Navigate2(&address);

        LRESULT res = CAxDialogImpl<CMyDialog>::OnInitDialog(uMsg, wParam, lParam, bHandled);
        return 0;
    }
public:
    LRESULT OnBnCancel(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
    {
        EndDialog(IDCANCEL);
        return 0;
    }
    LRESULT OnBnOk(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
    {
        EndDialog(IDOK);
        return 0;
    }
};
CComModule _Module;

int main()
{
    CMyDialog dlg;
    dlg.DoModal();

    return 0;
}

Chromium Edge 还有一个 Edge 控制器 WebView controller

【讨论】:

  • 抱歉回复晚了。我试过了,效果很好。我遇到的唯一问题是 VS 在导入 shdocvw.dll 时出错。我将它与命名空间 SHDocVw 及其工作一起删除。那么,真的需要dll吗?
  • @Harsh 导入仅用于编译。 import 指令仅生成用于编译的标头。标头将具有扩展名 .tlh
  • 如果网页包含表单和提交按钮,是否可以通过添加监听器或事件处理程序来检测按钮点击?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 2012-04-18
  • 2012-07-22
  • 2022-10-23
  • 2013-10-04
相关资源
最近更新 更多