Unity EmbeddedBrowser浏览器插件事件通讯

  • 模拟鼠标输入
  • 调用Embedded接口直接输入

Embedded Browser浏览器插件是一款基于Chrome内核的内嵌浏览器,被许多开发语言和框架内嵌,为开发者提供方便的浏览网页支持。
Embedded Browser浏览器的工作方式是在后台运行浏览器进程,通过后台浏览器通讯解析网址,合成Texture贴图帧,传递给Unity,同时Unity可以调用接口,与浏览器进程进行交互。


Embedded这种集成方式区别于移动端的WebView集成方式(WebView是将一块屏幕空间开辟出来给WebView使用,调用者和WebView之间没有太多关联),提供更自由的整合渠道,可以在三维空间和实体表面显示网页,使用更灵活。

模拟鼠标输入

通常,无论是Screen Canvas还是三维Mesh表面的Embedded页面,插件已经提供了无缝的输入方式,内部提供的MapPointerToBrowser已经帮助用户将三维坐标转换到Browser平面坐标。
如果我们要自定义输入,如远程控制,通过远程主机发送控制坐标和鼠标按键通讯,驱动非用户硬件输入,通常做法是引入Windows DLL,通过模拟鼠标可以达到要求

  #region DLLs[DllImport("user32.dll")]private static extern int SetCursorPos(int x, int y); //设置光标位置[DllImport("user32.dll")]private static extern bool GetCursorPos(ref int x, ref int y); //获取光标位置[DllImport("user32.dll")]static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, System.UIntPtr extraInfo); // 鼠标事件// 方法参数说明// VOID mouse_event(//     DWORD dwFlags,         // motion and click options//     DWORD dx,              // horizontal position or change//     DWORD dy,              // vertical position or change//     DWORD dwData,          // wheel movement//     ULONG_PTR dwExtraInfo  // application-defined information// );public enum MouseEventFlag : uint{Move = 0x0001,LeftDown = 0x0002,LeftUp = 0x0004,RightDown = 0x0008,RightUp = 0x0010,MiddleDown = 0x0020,MiddleUp = 0x0040,XDown = 0x0080,XUp = 0x0100,Wheel = 0x0800,VirtualDesk = 0x4000,Absolute = 0x8000}#endregion

调用代码

  IEnumerator MouseClick(int x, int y){SetCursorPos(x, y);mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, System.UIntPtr.Zero);yield return new WaitForSeconds(0.1f);mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, System.UIntPtr.Zero);}

这种方法在调试和使用时,由于窗口分辨率不是1:1全屏导致坐标映射错误、窗口不在前台、干扰正常鼠操作等等问题,使用非常不友好。

调用Embedded接口直接输入

查看源代码BrowserInput.cs,可以看到插件处理输入事件代码

   private void HandleMouseInput() {var handler = browser.UIHandler;var mousePos = handler.MousePosition;var currentButtons = handler.MouseButtons;var mouseScroll = handler.MouseScroll;if (mousePos != prevPos) {BrowserNative.zfb_mouseMove(browser.browserId, mousePos.x, 1 - mousePos.y);}// ...
}

核心代码

BrowserNative.zfb_mouseMove(browser.browserId, mousePos.x, 1 - mousePos.y);

EmbeddedBrowser.Browser是虚拟给Unity使用的Browser对象,实际的浏览器对象是BrowserNative定义的一系列DLL接口。
browserId是一个数组索引,标记所有实际浏览器实例的列表
EmbeddedBrowser.Browser创建时加入allBrowsers列表

      unsafeBrowserId = newId;allBrowsers[unsafeBrowserId] = this;

按图索骥,BrowserNative包含了一系列浏览器接口,直接调用这些接口就可以扩展插件给我们定义的功能。
代码节选

   /*** Reports the mouse's current location.* x and y are in the range [0,1]. (0, 0) is top-left, (1, 1) is bottom-right*/public delegate void Calltype_zfb_mouseMove(int id, float x, float y);public static Calltype_zfb_mouseMove zfb_mouseMove;public delegate void Calltype_zfb_mouseButton(int id, MouseButton button, bool down, int clickCount);public static Calltype_zfb_mouseButton zfb_mouseButton;/** Reports a mouse scroll. One "tick" of a scroll wheel is generally around 120 units. */public delegate void Calltype_zfb_mouseScroll(int id, int deltaX, int deltaY);public static Calltype_zfb_mouseScroll zfb_mouseScroll;/*** Report a key down/up event. Repeated "virtual" keystrokes are simulated by repeating the down event without* an interveneing up event.*/public delegate void Calltype_zfb_keyEvent(int id, bool down, int windowsKeyCode);public static Calltype_zfb_keyEvent zfb_keyEvent;/*** Report a typed character. This typically interleaves with calls to zfb_keyEvent*/public delegate void Calltype_zfb_characterEvent(int id, int character, int windowsKeyCode);public static Calltype_zfb_characterEvent zfb_characterEvent;/** Register a function to call when console.log etc. is called in the browser. */public delegate void Calltype_zfb_registerConsoleCallback(int id, ConsoleFunc callback);public static Calltype_zfb_registerConsoleCallback zfb_registerConsoleCallback;public delegate void Calltype_zfb_evalJS(int id, string script, string scriptURL);public static Calltype_zfb_evalJS zfb_evalJS;

调用BrowserNative接口,唯一需要标记是browserId,这个在EmbeddedBrowser.Browser中是一个保护变量

    /** Handle to the native browser. */[NonSerialized]internal protected int browserId;

我们给他增加一个公有属性

    /** Handle to the native browser. */[NonSerialized]internal protected int browserId;public int BrowserId { get { return browserId; } } // 增加公有属性暴露browserId

之后,我们就可以直接调用BrowserNative接口模拟鼠标输入了

  public void UpdateMouseEvent(EventType eventType, ViewRect rect){float x = rect.x / rect.width;float y = rect.y / rect.height;Vector2 pos = MapPointerToBrowser(x, y, viewRect);if (eventType == EventType.MouseDown){ZenFulcrum.EmbeddedBrowser.BrowserNative.zfb_mouseMove(browser.BrowserId, pos.x, pos.y); // 注意:x,y坐标为0-1范围ZenFulcrum.EmbeddedBrowser.BrowserNative.zfb_mouseButton(browser.BrowserId, ZenFulcrum.EmbeddedBrowser.BrowserNative.MouseButton.MBT_LEFT, true, 1);}else if (eventType == EventType.MouseUp){ZenFulcrum.EmbeddedBrowser.BrowserNative.zfb_mouseButton(browser.BrowserId, ZenFulcrum.EmbeddedBrowser.BrowserNative.MouseButton.MBT_LEFT, false, 1);}else if (eventType == EventType.MouseMove){ZenFulcrum.EmbeddedBrowser.BrowserNative.zfb_mouseMove(browser.BrowserId, pos.x, pos.y); // 注意:x,y坐标为0-1范围}}

Unity EmbeddedBrowser浏览器插件事件通讯相关推荐

  1. [转]浅谈浏览器插件检测 和自定义协议的支持

    前一阵子一直在折腾浏览器的插件检测和自定义协议的支持. 经过种种痛苦的折腾,算是对这一领域有了点浅显的认知.特此记录一下 一.背景知识 自定义协议:常用的协议有 http:// https://  f ...

  2. 赶快卸载!微软新公布了18个流氓浏览器插件!

    为了增强浏览器的功能,我们通常会在上面安装各种插件. 一些需要第三方软件才能实现的效果,通过插件都可以在浏览器内快速实现. 浏览器插件固然强大方便,但是也有一些弊端--近年来,大量恶意插件在Chrom ...

  3. 如何开发一个浏览器插件

    参考文章 Chrome 平台 API 一天学会Chrome插件开发 30分钟开发一款抓取网站图片资源的浏览器插件 manifest.json参数详解 Content Security Policy 入 ...

  4. 虚幻浏览器插件 WebView

    虚幻浏览器插件 WebView 背景 WebView解决的问题 WebView 简介 WebView 技术交流 WebView 特性 WebView 效果 WebView 下载说明 背景 使用过UE官 ...

  5. 浏览器插件的开发学习

    今天闲来无事,想到公司在开发浏览器插件的问题上比较纠结,所以我整理了下,以便以后用到可以快速上手 谷歌浏览器插件是一种小型的用于定制浏览器体验的程序.通过插件,可以自定义浏览器的一些行为来适应个人的需 ...

  6. 超详细带你入门开发一个超实用的浏览器插件

    相信大家平时在电脑上逛掘金.知乎网站时,肯定有看到过下面超级烦人的跳转拦截确认页面 虽然这种拦截的初衷是好的,但是我相信大家平时肯定不会因为有了这个拦截提醒页面,就会对即将打开的网站安全性提高自己的警 ...

  7. 一个去广告的浏览器插件

    不知道为什么,全世界都认为好用的谷歌被排挤出了大陆,导致国内某度为霸一方,利益熏心,由它导致的悲惨事件简直不胜枚举,罄竹难书. 所以推荐一款去广告的浏览器插件,适用于各种浏览器,打开网址安装这个插件就 ...

  8. 赶快卸载!又一批恶意浏览器插件曝光,部分含木马病毒

    作为全球第一的浏览器,谷歌的Chrome插件商店自然也是规模最大的. 在商店里,有来自世界各地开发者提供的丰富的扩展程序或应用,极大地方便了用户的使用. 但是一直以来,浏览器插件也存在诸多弊端,尤其是 ...

  9. 运用前端知识做一个csdn浏览器插件

    过去我csdn等级达到5级时,能体验到一个月csdn的vip博客皮肤,但是只能体验一个月啊!怎样才能长久体验呢?随着时间的推移,现在,我在网上学会了一个玩意,那就是浏览器插件,通过制作一个浏览器插件, ...

  10. 谷歌Chrome清除秘密进行加密货币挖矿的浏览器插件

    点击上方 "蓝色字" 可关注我们! 暴走时评: "Archive Poster"是一款在Tumblr用户间颇为流行的Chrome浏览器插件,但最近人们反映它会劫 ...

最新文章

  1. EF-Net一种适用于双流SOD的有效检测模型(Pattern Recognition)
  2. ceph rgw java_java 使用amazon s3接口访问本地ceph rgw
  3. Day25 linux shell中的特殊符号与命令
  4. 基于Springboot实现医院HIS信息管理系统
  5. GridView分页(第一页、上一页、下一页、最后页、当前页数/总页数)
  6. jacoco入门_代码覆盖度工具jacoco的入门
  7. Microsoft SQL Server 存储过程
  8. AOP切入同类调用方法不起作用,AopContext.currentProxy()帮你解决这个坑
  9. 改进初学者的PID-采样时间
  10. 框架升级后某个类型所在程序集发生转移,应用还能正常运行吗?
  11. 用计算机模拟病毒,计算机模拟揭露HIV病毒体内传播细节,有望为治疗提供新途径...
  12. $.ajax()方法
  13. String.resize()
  14. Google提供的ADB工具包下载地址
  15. 计算机技术在工业的应用,计算机技术在工业自动化控制的应用
  16. python分行政区域汇总_python:编写行政区域三级菜单(day 1)
  17. layui数据表格增加自动换行后,拖动列宽固定列错乱变形
  18. 小游戏开发设计之塔防类游戏
  19. [音乐天堂]Eventide
  20. 青少年编程究竟应该从什么语言学起?

热门文章

  1. 网站建设-网站设计怎么样做的更好?
  2. 金蝶K3--生产领料单--更新销售订单编号
  3. 全智通A+常见问题汇总解答—A+维修管理—维修领料,修改领料单材料归属到了另一个维修单下
  4. 在线绘制网络拓扑图操作方法分享
  5. c语言汉诺塔课设计报告,汉诺塔游戏的设计
  6. 数据库系统,数据库应用系统,数据库管理系统,数据库
  7. dfuse 加入 BGA 区块链游戏联盟
  8. 程序员也需要知道的经济学通识
  9. 帝国cms后台admin帐号密码忘记的处理方法
  10. Go语言aes加密解密处理