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, ); 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
WM_COPYDATA+BHO+Qt实现进程间通信的更多相关文章
- WM_COPYDATA实现的不同进程间通信
进程间通信,通过SendMessage向另一进程发送WM_COPYDATA消息,实现不同进程间的消息通信. 需求:已写好一个工具软件,想在不更改当前的软件开发的前提下,实现为后面新开发的软件提供数据推 ...
- 【Qt】Qt之进程间通信(IPC)【转】
简述 进程间通信,就是在不同进程之间传播或交换信息.那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区.但是,系统空间却是“ ...
- Qt之进程间通信(IPC)
简述 进程间通信,就是在不同进程之间传播或交换信息.那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区.但是,系统空间却是& ...
- 【Qt】Qt之进程间通信(Windows消息)【转】
简述 通过上一节的了解,我们可以看出进程通信的方式很多,今天分享下如何利用Windows消息机制来进行不同进程间的通信. 简述 效果 发送消息 自定义类型与接收窗体 发送数据 接收消息 设置标题 重写 ...
- Qt之进程间通信(TCP/IP)
简述 可以通过Qt提供的IPC使用TCP/IP,使用QtNetwork模块即可实现,TCP/IP在实现应用程序和进程内部通信或与远程进程间的通信方面非常有用. QtNetwork模块提供的类能够创建基 ...
- Qt之进程间通信(QProcess)
简述 QProcess可以在应用程序内部与其它进程通信,或启动其它应用程序.与在终端机之类的命令输入窗口上使用名称和参数是一样的,可以使用QProcess提供的函数start()启动进程.可以注册QS ...
- Qt之进程间通信(共享内存)
简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信.但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种 ...
- Qt之进程间通信(Windows消息)
简述 通过上一节的了解,我们可以看出进程通信的方式很多,今天分享下如何利用Windows消息机制来进行不同进程间的通信. 简述 效果 发送消息 自定义类型与接收窗体 发送数据 接收消息 设置标题 重写 ...
- 【Qt】Qt之进程间通信(QProcess)【转】
简述 前几节里,分享了进程通信的几种方式:Windows消息机制.Shared Memory(共享内存),本节讲解下关于进程通信的另外一种方式-QProcess. 简述 命令行参数启动 说明 实现 命 ...
随机推荐
- 基础 ByteBuffer 和 ByteBuf
缓冲区 ByteBuffer buffer = ByteBuffer.allocate(); ByteBuf https://www.jianshu.com/p/3fbf54b8e8ec
- Linux TCP/IP 连接查看和问题解决
netstat -nat|awk '{print awk $NF}'|sort|uniq -c|sort -n 上面的 命令可以帮助分析哪种Tcp状态数量异常 netstat -nat|gr ...
- 9 MySQL--多表查询
多表查询: http://www.cnblogs.com/linhaifeng/articles/7267596.html 1.多表连接查询 2.符合条件连接查询 3.子查询 一.准备表 #建表 cr ...
- localStorage,sessionStorage
h5的本地存储. 现代浏览器普遍开始支持H5本地存储,localStorage.sessionStorage.可以用来代替cookie的一部分存储功能,他比cookie存储量更大.比较实用. 两者用法 ...
- eclipse中使用maven的 maven install
windows -> preferences -> Java -> Installed JREs 在default VM arguments 中添加 -Dmaven.multiMod ...
- redis在Web中的使用
redis是一个键值对数据库,用于缓存数据. redis是一个key-value存储系统.和Memcached数据库类似,它支持存储的value类型相对更多,包括string(字符串).list(链表 ...
- spring boot 1
1.创建项目. meven可以配置阿里云meven镜像 <mirror> <id>nexus-aliyun</id> <mirrorOf>central ...
- An Introduction To Value at Risk (VAR)
http://www.investopedia.com/articles/04/092904.asp http://www.jpmorgan.com/tss/General/email/1159360 ...
- docker daemon文件/etc/docker/daemon.json配置
On Linux The default location of the configuration file on Linux is /etc/docker/daemon.json. The --c ...
- break,continue以及pass的使用
1.break是提前结束循环 for i in range(1,100): if i%2 == 0: print("wrong") break#直接结束循环,并且不打印下面的pri ...