分享

钩住外部进程窗口

 只怕想不到 2022-03-24

上次我们介绍了使用 aardio 提供的 WebView2 扩展库 web.view 调用 JS 版 Ruffle 非常方便。

Jacen He,公众号:aardioWebView2 嵌入开源 Flash 控件 Ruffle

通过扩展库 process.ruffle —— 则可以让 Ruffle 桌面版的窗口嵌入我们的界面。这个库之前的实现是把 Ruffle 创建的桌面独立窗口加上 WS_CHILD  样式变为子窗口,再指定父窗口,调整大小后嵌入我们的界面。但是这种方式 —— 有时候会出现一些奇怪的问题( 例如 Flash 动画卡住,鼠标晃一下才会动 )。

在 aardio 里还有一个更好的选择:我们可以用 orphanWindow 功能将独立窗口伪装为子窗口,关键代码只有一句:

this._form.orphanWindow(,this.hwndFlash);

Ruffle 桌面版打开 Flash 会创建一个带标题栏,带边框的独立窗口,如果在打开 Flash 动画以后再去移除窗口边框 —— 那就会看到带边框的窗口在屏幕上一闪而过。下面我们就来解决这个问题。


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

this.apiHook = process.apiHook(ruffleExePath,args,{  suspended = true;//启动后暂停 });

注意参数里指定了进程启动后暂停,下面安装好 API 钩子以后再恢复运行。

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

//安装 HOOKthis.hookCreateWindowEx = this.apiHook.install('User32.dll' ,'CreateWindowExW','CreateWindowExHook.dll','_CreateWindowExHook@48'); this.hookSetWindowPos = this.apiHook.install('User32.dll'  ,'SetWindowPos','CreateWindowExHook.dll','_hookSetWindowPos@28');


然后再获取外部进程的 hookSet 函数并转换为 aardio 函数调用:

var hookSet = this.process.remoteApi('void(addr pc,addr ps,addr hwndHost)'  ,'CreateWindowExHook.dll','hookSet','cdecl');  hookSet(  this.hookCreateWindowEx.addrTrampoline,//这是原来的 CreateWindowEx 函数指针地址   this.hookSetWindowPos.addrTrampoline,//这是原来的 SetWindowPos 函数指针地址   this._form.hwnd);

现在可以用下面的代码让进程继续运行了:

this.process.resume();

再加上下面的代码保证主进程退出时 ruffle.exe 也会自动退出:

this.process.assignToJobObject(..process.job.limitKill);

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();

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多