flash控件(flash控件怎么安装)

方法一、使用基于微软 WebView2 的 web.view 嵌入 JS 版 RuffleRuffle是一个开源的免费Flash播放器。ruffle.js的网页

方法一、使用基于微软 WebView2 的 web.view 嵌入 JS 版 Ruffle

Ruffle是一个开源的免费Flash播放器。ruffle.js的网页版很小,一包1.7 MB。调用起来也很简单。aardio标准库中的web.view (WebView2)可以完美支持ruffle.js,但是我们要先解决两个小问题:

1.ruffle.js如果通过URL加载Flash动画不正常会报错,但是直接在内存中加载动画数据就可以了。
2。浏览器不能用代码直接访问本地文件。

我们先用外部接口导出aardio函数来解决上面的问题。我们可以先用aardio把远程或者本地的swf文件读入内存,然后转换成字节数组发送到ruffle.js关键代码如下:

导入web.viewvar WB = web . view(winform);WB . external = { get SWF = function(){//可以返回一个包含SWF文件二进制数据的数组,safearray,buffer返回com . safe array v(inet . http . get(& # 34;https://update . a ardio . com/v10 . files/demo/transparent . swf & # 34;) );//本地文件可以直接返回buffer return string . load buffer(& # 34;\ res \ tet.swf & # 34);};}返回一个数组到ruffle.js就行了(buffer,array,COM array都可以)。注意,string.load加载文件返回一个字符串,string.loadBuffer()返回一个字节数组。

在网页内部,加载了包含以下JavaScript的Flash动画:

const ruffle =窗口。ruffle player . newest();const player = ruffle . create player();player . style . width = & # 34;100vw & # 34;player . style . height = & # 34;100vh & # 34;const container = document . getelementbyid(& # 34;集装箱& # 34;);container . appendchild(player);player . load({ data:await a ardio . get swf()});在JS中使用aardio.getSwf()调用aardio导出的wb.external.getSwf()函数。注意,在WebView2中所有的本地函数都是异步的,所以await用于获取返回值(await只能用在异步函数中)。

Ruffle.js最好通过HTTP server加载,在aardio中可以轻松解决。如果创建了aardio项目,只需将所有网页和ruffle.js添加到项目的资源目录中,然后使用类似于:

WB . go(wsock . TCP . simple http server . starturl(& # 34;/RES/swf/index . html & # 34;))打开网页就行了。aardio会自动使用HTTP协议内存加载这个资源目录下的所有文件(可以发布为独立的EXE文件)。

写样本的时候可以运行给大家复制。没有创建工程文件,HTML代码与音频代码混合在一起。于是我写了一个扩展库web.ruffle,通过一个HTTP服务器获取访问ruffle.js的地址。

首先,在aardio中导出getRuffleScriptSrc函数:

导入web.ruffle导入web.viewvar WB = web . view(winform);WB . external = { get swf = function(){ return com。SafeArrayV(inet . http . get(& # 34;https://update . a ardio . com/v10 . files/demo/transparent . swf & # 34;) );};getruffscriptsrc = function(){ return web . ruffle . geturl(& # 34;/ruffle/ruffle . js & # 34;);};}然后在HTML代码中添加空的脚本元素:

& lt脚本id = & # 34莱夫& # 34;& gt& lt/script & gt;然后在JavaScript中调用aardio函数来获取ruffle的地址。js并加载JS:

var荷叶边脚本= document . getelementbyid(& # 34;莱夫& # 34;);ruffle script . src = await a ardio . getrufflescriptsrc();关于示例的完整源代码,请参见“a radio example/Web interface/Web . view/Flash”。

flash控件(flash控件怎么安装)插图

方法二、嵌入 Ruffle 桌面版:钩住外部进程窗口

无线电扩展库进程。Ruffle-可以使ruffle桌面窗口嵌入我们的软件界面。这个库之前的实现是把Ruffle用WS_CHILD样式创建的桌面独立窗口改成子窗口,然后指定父窗口,调整大小,嵌入我们的界面。但是这种方式——有时候会出现一些奇怪的问题(比如Flash动画卡顿,鼠标晃动才动)。

flash控件(flash控件怎么安装)插图(1)

在aardio中有更好的选择:我们可以用orphanWindow函数将独立窗口伪装成子窗口,关键代码只有一句话:

这个。_form.orphanWindow(,this . hwndflash);Ruffle桌面版在打开Flash时会创建一个带标题栏和边框的独立窗口。如果您在打开Flash动画后移除窗口边框,您将会看到带有边框的窗口在屏幕上闪烁。下面我们来解决这个问题。

首先,我们用process.apiHook代替process来创建Ruffle进程:

this . API hook = process . API hook(fluflexexpath,args,{ suspended = true//启动后暂停});请注意,参数指定进程在启动后将被挂起,然后在它恢复操作之前安装API挂钩。

首先,安装拦截和创建窗口的API函数CreateWindowExW,以及设置窗口位置的函数SetWindowPos。关键代码如下:

//安装hook this . hookcreatewindowex = this . API hook . install(& # 34;user 32 . dll & # 34;,"CreateWindowExW & # 34,"CreateWindowExHook.dll & # 34,"_ CreateWindowExHook @ 48 & # 34);this . hooksetwindowpos = this . API hook . install(& # 34;user 32 . dll & # 34;,"SetWindowPos & # 34,"CreateWindowExHook.dll & # 34,"_ hookSetWindowPos @ 28 & # 34);然后获取外部进程的hookSet函数,转换成aardio函数调用:

var hookSet = this . process . remote API(& # 34;void(addr pc,addr ps,addr hwnd host)& # 34;,"CreateWindowExHook.dll & # 34,"挂钩套件& # 34;,"cdecl & # 34);Hookset(这个。HookCreateWindowEx。AddrTrampoline,//这是CreateWindowEx函数This的原始指针地址。HookSetWindowPos。AddrTrampoline,//这是SetWindowPOS函数This的原始指针地址。_ form . hwnd);现在,您可以使用以下代码来保持流程运行:

this . process . resume();另外,下面的代码保证当主进程退出时,ruffle.exe会自动退出:

this.process.assignToJobObject(..process . job . limit kill);DLL的源代码很少,可以在process.ruffle扩展库的目录下找到。注意Ruffle创建多个窗口,设置参数避免改变不可见窗口。

测试它:

flash控件(flash控件怎么安装)插图(2)

呼叫示例:

导入win . ui;/* DSG { { */var winform = win . form(text = & # 34;开源Flash控件Ruffle & # 34;右= 759;bottom = 512)winform . add(static = { cls = & # 34;静态& # 34;;text = & # 34静态& # 34;;左= 3;top = 1;右= 758;bottom = 443db = 1;dl = 1;dr = 1;dt = 1;z = 1 })/* } } */import process . ruffle;var ruffle = process . ruffle(winform . static);winform . show();//自定义Flash参数ruffle.flashVars = { k = & # 34v & # 34,k2 = 123 };//也可以打开本地文件ruffle . go(& # 34;https://ruffle.rs/demo/swfs/wasted_sky.swf");win . loop message();请注意,Ruffle桌面不支持Win7。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/77212.html

发表回复

登录后才能评论