如何完美、简单地嵌入外部程序窗口到界面中

admin2022-05-27  3.9K+

实际上不要说外部进程,就是不同的线程搞这种父子窗口嵌套都容易出问题。正常的所有窗口应当在同一个界面线程中 —— 这是基本游戏规则。


嵌入外部进程窗口,用任何语言都不是一个简单的 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  —— 这其实也是外部进程创建的窗口。


其实多看看范例,你会发现还有更多这样的好东西。

转载请注明原文地址: http://aardio.net/read-307.html
最新回复(1)
aardio问答
aardio编程语言