最近项目有一个需求: 点击网页上某个按钮, 通知 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
来源: https://www.cnblogs.com/hyuganatsu/p/WM_COPYDATA.html