实际上不要说外部进程,就是不同的线程搞这种父子窗口嵌套都容易出问题。正常的所有窗口应当在同一个界面线程中 —— 这是基本游戏规则。
嵌入外部进程窗口,用任何语言都不是一个简单的 setParent 可以搞定的事情。区别仅仅是 aardio 窗口会自适应调整界面,这促使问题可以提前在开发环境中被检测出来。如果你换一个编程语言并且浅尝辄止 —— 你可能发现不了真正的问题 。
就以嵌入记事本窗口为例,我们看一看 aardio 自带范例的运行效果:
上面范例的源代码其实很简单:
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=886;bottom=627;parent=...)
winform.add(
button={cls="button";text="点这里试试";left=554;top=561;right=801;bottom=620;color=14120960;db=1;dr=1;font=LOGFONT(h=-14);note="这点里操作记事本的编辑框";z=2};
static={cls="static";left=46;top=22;right=854;bottom=542;db=1;dl=1;dr=1;dt=1;z=1}
)
/*}}*/
import winex;
import process;
process.executeWaitInput("notepad.exe");//运行记事本
var hwndNotepad,hNotepadEdit = winex.wait(,,"Notepad","<RichEditD2DPT>|<Edit>");//查找句柄
//悬浮影子窗口:外部进程窗口附加到 winform.static 并如影随形的自适应缩放调整位置
winex.orphanWindow(winform.static,hwndNotepad)
//退出程序前让记事本退出
winform.onClose = function(hwnd,message,wParam,lParam){
if(!winex.closeAndWait(hwndNotepad)) return 1;
}
import winex.ctrl.edit;
var edit = winex.ctrl.edit(hNotepadEdit);
winform.button.oncommand = function(id,event){
edit.text="测试一下";
edit.print("测试调用函数",123,{
1,2,3
})
}
winform.show();
win.loopMessage();
这得益于 aardio 中强大的 orphanWindow,orphanWindow 在 aardio 程序中是很常用的。你学习任何一门语言,这些基础且常用的控件功能都需要有所了解,范例也需要看看。
aardio 中嵌入外部进程窗口的库、范例其实非常多,例如 Electron 的范例就是嵌入外部进程窗口,这个我也踩过不少坑,最难发现的是在一些电脑上正常,在一些电脑上出现不能输入,边框无法消除等奇怪的问题,当然这些问题最终 aardio 都解决了。如果你想要你写的程序没有问题 —— 这都需要经历艰难的过程,无论用什么编程语言都一样。
或者说你用非 Python 语言写的界面嵌入一下 Python 用 tkinter 实现的界面试试你会遇到多少麻烦。aardio 做这事很简单:
用 aardio 嵌入 tkinter 窗口
Jacen He,公众号:aardio
aardio Python tkinter matplotlib 没试过这样玩吧
再例如:
将 Ruffle 桌面版 嵌入为界面中的 Flash 控件
Jacen He,公众号:aardio
钩住外部进程窗口
一个更有趣的例子是 MPlayer 视频播放器,这其实也是调用 MPlayer.exe,看范例:
嵌入 aardio 窗口中的效果:
aardio 标准库中的 web.view 嵌入的 WebView2 —— 这其实也是外部进程创建的窗口。
其实多看看范例,你会发现还有更多这样的好东西。
主题数 170 | 今日评论 0 | 今日主题 0 |