忠爱无言_WM_COPYDATA+BHO+Qt实现进程间通信

最近项目有一个需求:点击网页上某个按钮,通知Qt客户端。网页相关操作使用了BHO,BHO与Qt通信通过WB_COPYDATA,为什么这么麻烦呢,因为项目正好用到了BHO,可能还有其他方式,能直接通过网页调Qt?欢迎大家指教。好了,思路大体就是这样了,下面上代码。

先说下环境吧,BHO使用C#写的,代码很简单,工具是vs2013 express。Qt是5.6.2 msvc2013.

xian shuo xia huan jing ba, BHO shi yong C xie de, dai ma hen jian dan, gong ju shi vs2013 express. Qt shi 5. 6. 2 msvc2013.

BHO代码

public void OnDocumentComplete(object pDisp, ref object URL)
        {

            HTMLDocument document = (HTMLDocument)webBrowser.Document;

            dynamic window = document.parentWindow;
            IExpando ScriptObject = (IExpando)window;
            PropertyInfo btnEvent = ScriptObject.GetProperty("toQt", BindingFlags.Default);
            if (btnEvent == null) btnEvent = ScriptObject.AddProperty("toQt");
            btnEvent.SetValue(ScriptObject, this, null);

            IHTMLElement head = (IHTMLElement)((IHTMLElementCollection)
                                    document.all.tags("head")).item(null, 0);

            IHTMLScriptElement scriptObject =
                (IHTMLScriptElement)document.createElement("script");
            scriptObject.type = @"text/javascript";
            scriptObject.text = "var myEles = document.getElementById("su"); if(myEles != undefined && myEles != null) {myEles.onmouseup=aaa;function aaa(){window.toQt.sendMsgToQt("hahaha")}}";
            ((HTMLHeadElement)head).appendChild((IHTMLDOMNode)scriptObject);

        }

其中,scriptObject.text = "",这一段是js代码,插入到百度首页的head里面。当鼠标单机“百度一下”按钮时,会调用C#的sendMsgToQt方法,具体的代码请移步github链接

?链接:https://github.com/poisson-natsu/bho

?

Qt代码

?

MainWindow w;
w.setWindowTitle("个人工作集成平台助手");

C#(BHO)与Qt通信,WM_COPYDATA要通过窗口名称来找到其他进程,所以Qt的标题要和BHO里面的一致。

?

bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    MSG *msg = (MSG*)message;
    if (msg->message == WM_COPYDATA){
        qDebug() << "*******************";
        COPYDATASTRUCT * p = reinterpret_cast(msg->lParam);
        m_label->setText(static_cast<char*>(p->lpData));
    }
    return QMainWindow::nativeEvent(eventType, message, result);
}

在nativeEvent方法里面写事件拦截器,当message的类型为WM_COPYDATA时,则重新设置label内容。

?

    QApplication a(argc, argv);
    a.setApplicationName(QStringLiteral("个人工作集成平台助手"));
    EventHandler eventHandler;
    a.installNativeEventFilter(&eventHandler);

也可以直接在main.cpp里面,通过调用QApplication::installNativeEventFilter方法安装事件拦截器,达到同样的效果

?具体代码请移步github

链接:https://github.com/poisson-natsu/WM_COPYDATA

他比较懒,若有问题,可以加他扣扣交流:576031288

?

当前文章:http://www.srouleau.com/zzoc7/160655-264927-19311.html

发布时间:02:48:40

www.126888.com??白小旗袍a加大版彩图2017??26278.com铁算盘论坛??64848开奖直播??97999神算玄机??金算盘论坛??正版香港通天报彩图??www.311211.com??红姐118图库彩图??34595b.com??

用手机访问
下载APP
appicon 下载
扫一扫,手机浏览
code
休闲娱乐
综合热点资讯
单机游戏下载
精彩专栏
游民星空联运游戏