博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WM_COPYDATA+BHO+Qt实现进程间通信
阅读量:6269 次
发布时间:2019-06-22

本文共 2285 字,大约阅读时间需要 7 分钟。

最近项目有一个需求:点击网页上某个按钮,通知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.οnmοuseup=aaa;function aaa(){window.toQt.sendMsgToQt('hahaha')}}";            ((HTMLHeadElement)head).appendChild((IHTMLDOMNode)scriptObject);        }

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

 链接:

 

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
(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

链接:

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

 

转载于:https://www.cnblogs.com/hyuganatsu/p/WM_COPYDATA.html

你可能感兴趣的文章
Linux_DHCP服务搭建
查看>>
[SilverLight]DataGrid实现批量输入(like Excel)(补充)
查看>>
秋式广告杀手:广告拦截原理与杀手组织
查看>>
翻译 | 摆脱浏览器限制的JavaScript
查看>>
闲扯下午引爆乌云社区“盗窃”乌云币事件
查看>>
02@在类的头文件中尽量少引入其他头文件
查看>>
JAVA IO BIO NIO AIO
查看>>
input checkbox 复选框大小修改
查看>>
网吧维护工具
查看>>
BOOT.INI文件参数
查看>>
vmstat详解
查看>>
新年第一镖
查看>>
unbtu使用笔记
查看>>
OEA 中 WPF 树型表格虚拟化设计方案
查看>>
Android程序开发初级教程(一) 开始 Hello Android
查看>>
使用Gradle打RPM包
查看>>
“我意识到”的意义
查看>>
淘宝天猫上新辅助工具-新品填表
查看>>
再学 GDI+[43]: 文本输出 - 获取已安装的字体列表
查看>>
nginx反向代理
查看>>