通过扩展库 process.ruffle —— 则可以让 Ruffle 桌面版的窗口嵌入我们的界面。这个库之前的实现是把 Ruffle 创建的桌面独立窗口加上 WS_CHILD 样式变为子窗口,再指定父窗口,调整大小后嵌入我们的界面。但是这种方式 —— 有时候会出现一些奇怪的问题( 例如 Flash 动画卡住,鼠标晃一下才会动 )。 在 aardio 里还有一个更好的选择:我们可以用 orphanWindow 功能将独立窗口伪装为子窗口,关键代码只有一句: this._form.orphanWindow(,this.hwndFlash); Ruffle 桌面版打开 Flash 会创建一个带标题栏,带边框的独立窗口,如果在打开 Flash 动画以后再去移除窗口边框 —— 那就会看到带边框的窗口在屏幕上一闪而过。下面我们就来解决这个问题。
注意参数里指定了进程启动后暂停,下面安装好 API 钩子以后再恢复运行。 //安装 HOOK this.hookCreateWindowEx = this.apiHook.install('User32.dll' ,'CreateWindowExW','CreateWindowExHook.dll','_CreateWindowExHook@48'); this.hookSetWindowPos = this.apiHook.install('User32.dll' ,'SetWindowPos','CreateWindowExHook.dll','_hookSetWindowPos@28');
现在可以用下面的代码让进程继续运行了: this.process.resume(); 再加上下面的代码保证主进程退出时 ruffle.exe 也会自动退出:
DLL 的源代码很少,在 process.ruffle 扩展库目录下可以找到。要注意 Ruffle 创建了多个窗口,设置参数要避免改动不可见的那个窗口。
import win.ui; /*DSG{{*/ var winform = win.form(text='开源 Flash 控件 Ruffle';right=759;bottom=512) winform.add( static={cls='static';text='Static';left=3;top=1;right=758;bottom=443;db=1;dl=1;dr=1;dt=1;z=1} ) /*}}*/
import process.ruffle; var ruffle = process.ruffle(winform.static); winform.show();
//自定义 Flash 参数 ruffle.flashVars = {k='v',k2=123};
//也可以打开本地文件 ruffle.go('https:///demo/swfs/wasted_sky.swf'); win.loopMessage(); |
|