zoukankan      html  css  js  c++  java
  • WM_COPYDATA+BHO+Qt实现进程间通信

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

    先说下环境吧,BHO使用C#写的,代码很简单,工具是vs2013 express。Qt是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<COPYDATASTRUCT*>(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

  • 相关阅读:
    PostgreSQL查看等待锁的SQL和进程
    effective_io_concurrency很重要的一个参数
    PostgreSQL逻辑复制到kafka-实践
    Linux下路由配置梳理(转)
    创建B树,动态添加节点,并使用三种遍历算法对树进行遍历
    思考--PostgreSQL在与mysql的比较中稍微弱势项
    思考-继续思考在数据库中两个表join的问题
    思考--mysql 分库分表的思考
    超级实用的网址大全
    C++ 读取txt文本内容,并将结果保存到新文本
  • 原文地址:https://www.cnblogs.com/hyuganatsu/p/WM_COPYDATA.html
Copyright © 2011-2022 走看看