aardio嵌入外部窗口(以scrcpy手机投屏窗口为例)

scrcpy是一个安卓手机投屏到电脑的开源组件。手机在开发者选项中打开USB调试开关,使用数据线连接到电脑,运行scrcpy.exe,就可以在电脑上查看手机屏幕,可以使用鼠标、键盘进行操作,并且提供了一系列命令行和快捷键,方便二次开发。我下载的是scrcpy-win32-v1.25,你也可以到github下载其他版本。

嵌入外部窗口并不是一个值得推荐的开发方式,但这个方法还是要掌握,有时候可以作为应急之选。下面是个小练习。

import win.ui;
/*DSG{{*/
var winform = win.form(text="未连接";right=759;bottom=469;bgcolor=12639424)
winform.add(
btnConnect={cls="button";text="连接手机";left=473;top=59;right=614;bottom=101;dr=1;dt=1;z=1};
btnDisconnect={cls="button";text="断开连接";left=472;top=127;right=613;bottom=169;dr=1;dt=1;z=2}
)
/*}}*/

import process.popen
import winex
import winex.key

winform.btnConnect.oncommand = function(id,event){
	if pp return ; 
	pp=process.popen("\scrcpy\scrcpy.exe")
	device=pp.expect("Device\:(.+?)\r",5000)
	if (!device ){
		pp.terminate()
		pp=null
		hwnd=null
		return win.msgbox("连接失败"); 
	}
	winform.text=device
	hwnd=winex.wait(,,"@SDL_app",,,pp.process.id)
	win.modifyStyle(hwnd,0x800000/*_WS_BORDER*/|0x40000/*_WS_THICKFRAME*/)
	winex.attach(hwnd,true) 
	winex.key.combine(hwnd,"ALT","W")
	winex.attach(hwnd,false)
	_,_,w0,h0=win.getPos(hwnd)
	win.setParent(hwnd,winform.hwnd)
	adjust(hwnd) 
	win.show(hwnd)
}

winform.btnDisconnect.oncommand = function(id,event){
	if pp pp.terminate();
	pp=null
	hwnd=null
	winform.text="未连接"
}

winform.onClose = function(hwnd,message,wParam,lParam){
    if pp pp.terminate()
}

winform.adjust = function( cx,cy,wParam ) {	 
	adjust(hwnd)  
};

adjust=function(hwnd){
	if !hwnd return ; 
	var rc=winform.getClientRect()	
	var height=rc.height()
	var h1=height-20
	var w1=h1*w0/h0
	win.setPos(hwnd,rc.left+50,rc.top+10,w1,h1)
}

winform.show();
win.loopMessage();
return winform;

 这里用的是设置父窗口的办法,有时候也可以用悬浮窗口。窗口样式需要改一下,位置和大小需要调一调,感觉不算复杂。

scrcpy有个默认控制台,为了屏蔽它,使用了管道。有时候,嵌套的程序在打开瞬间来不及调整,也可以用管道调用,调整好了再显示。

第一次使用嵌入窗口,可能理解得不透彻,欢迎指正。