MFC与Webbrowser交互(通过JS)

最近修改老旧的MFC项目,用的网页做界面,和HTML交互采用的是COM方式,繁琐,丑陋又性能低,于是考虑利用js来进行界面交互,查了一天的资料,现在整理如下,供后来需要的人参考,虽然大概几乎不会有人用MFC来做项目了(笑),用winform或者WPF或者网页做界面,高性能部分用C++封装的dll也许是更好的选择,当然直接在exe里面提供http访问接口是最吼的(go语言赛高)!界面这个是比较大的话题,可以开个专题慢慢说了。。。

核心的一个CWebPage类是一个老外写的,封装了一些com操作,用来和webbrowser进行js调用,但是只能调用已经存在的js代码,有时需要自己向网页注入一些js函数(你懂的),你可以在一个空白页上面,用js生成整个页面。

    IHTMLDocument2* pHTMLDoc = (IHTMLDocument2*)web.get_Document();
    if(pHTMLDoc != NULL)
    {
        IHTMLWindow2* pHTMLWnd;
        pHTMLDoc->get_parentWindow( &pHTMLWnd );
        if (pHTMLWnd != NULL)
        {
            CString js_code;
            js_code="function test(str){ alert(str);return str;}";//此次为实际写入的javascript代码
            //js_code.Format(L"goToLocation(‘%s‘);",JScode);//JS函数名+参数
            VARIANT  ret;
            pHTMLWnd->execScript(js_code.AllocSysString(), L"Javascript", &ret);//执行javascript代码
            pHTMLWnd->Release();

            CWebPage page;
            page.SetDocument(web.get_Document());
            CComVariant varResult;
            page.CallJScript("test","123",&varResult);
            MessageBox(CString(varResult.bstrVal));
        }
        pHTMLDoc->Release();
    }   

先向网页注入(这样听上去比较高大上)一个js函数(代码只是方法之一,还有其他的方法就不列举了),然后通过webpage封装的方法调用函数并返回值,这样做的会比C++用COM接口操作网页简单而且速度更快(并没有测试,理论上应该是这样)

这里只是解决MFC调用js,js调用MFC比较复杂也就没有去深入,COM这种东西感觉真的是上古遗物了,项目里使用的是截获网页的跳转地址来判断需要进行的操作,基本上已经足够了,记得winform里的webbrowser和js互相调用是将对象封装成一个com对象暴露给webbrowser。

源码:下载

原文地址:https://www.cnblogs.com/HelliX/p/8533278.html

时间: 2025-01-13 23:27:39

MFC与Webbrowser交互(通过JS)的相关文章

Winform启动隐藏,WebBrowser交互JS

一.启动隐藏 Winform比较奇怪,Load的时候设置Visiable=false,无效.webBrowser_DocumentCompleted之后调用hide隐藏了窗体,但是在notifyIcon调用show也不能打开窗体.各种奇葩问题.最后stackOverFlow上找到答案.设置透明度,和取消显示在任务栏. private void Form1_Load(object sender, EventArgs e) { webBrowser1.ObjectForScripting = thi

webBrowser调用外部js文件和js函数(转载)

原文链接:http://fy5388.blog.163.com/blog/static/56499537201012594314130/ webBrowser调用外部js文件和js函数 '第一种方法:webbrowser动态调用html和js代码,都是动态的:代码示例: webBrowser1.Navigate("about:blank");webBrowser1.Document.OpenNew(True);webBrowser1.Document.Write("<H

js与ios交互,js示例

js与ios交互,js示例 js文件:coco3gNativeUser.js let c3_navtive_user = {}; (function(owner) { owner.temp = {}; //右上角按钮及事件 owner.__defineSetter__('right_button_item',function(item){ this._right_button_item = item; }); owner.__defineGetter__('right_button_item',

[Winform]js与webbrowser交互

摘要 目前项目中采用的方式是内嵌浏览器的方式,打开本地或者互联网上的h5页面.在开发之前做了一下调研.目前常用的在C#封装的浏览器内核中,Chromium 内核封装有Xilium.Cefglue.Cefsharp,Webkit 内核封装 Webkit.NET .OpenWebKitSharp等.webbrowser又与电脑上的IE版本相关,兼容性不好,在win10上,排版是好的,如果拿到win7上,就会出现排版错乱的现象.当然你可以通过修改注册表,进行制定ie的版本. js与webbrowser

C#中webbrowser与javascript(js)交互的方法

今天在做一个项目的时候需要用c#搞一个webbrowser,然后有些地方还需要与js交互.所以就查了一下资料,发现很多博客提到了但是却没有说下具体的操作.所以我就写一下. 开发环境是Visual Studio 2008 .阅读此文需要有C#和javascript开发基础. 1.首先新建一个项目,在默认窗体form1上拖拽一个webbrowser1. 2.给form1的Load时间事件添加如下代码: private void Form1_Load(object sender, EventArgs

基于数据交互的js模板

参考地址:http://www.zhangxinxu.com/wordpress/2012/09/javascript-html-json-template/ <!doctype html> <html> <head> <meta charset="UTF-8"> <title>js模板</title> </head> <body> <!--一般而言,HTML模板都是放在<tex

System.Windows.Forms.WebBrowser中 处理 js 脚本 window.Open 禁止新建窗口 的方法

wb 是 拖放在窗体上的 System.Windows.Forms.WebBrowser 在你的窗体代码中定义 SHDocVw.WebBrowser_V1 wb1; 在 你窗体的 load 事件中 加入下面的代码 wb1 = wb.ActiveXInstance as SHDocVw.WebBrowser_V1; wb1.NewWindow += wb1_NewWindow; 处理事件: void wb1_NewWindow(string URL, int Flags, string Targe

WPF Webbrowser中与JS传递参数

没什么特殊的. 要点一:使用json传递参数. 比如说我传递的数字数组到js中,我首先将参数转换为json.在传递js中,在函数中确保转成数字,最后添加到需要的地方即可 js代码: function getdatafromday(d ,t) { data0.time=d.split(","); var ds = JSON.parse(t) var cs =[]; for(var p in ds) { var o = parseInt(ds[p].O); var c = parseInt

MFC 盾webBrowser打开弹出的页面

void CansDlg::NewWindow3Explorer1(LPDISPATCH* ppDisp, BOOL* Cancel, unsigned long dwFlags, LPCTSTR bstrUrlContext, LPCTSTR bstrUrl) { // TODO: 在此处加入消息处理程序代码 //不打开新窗体 *Cancel = TRUE; } 方法II:重载Web控件所在窗体的方法"OnAmbientProperty" //[说明]此函数为主窗体方法重载,能够屏蔽