aardio 文档

process.desktop:私有桌面运行进程

用于在不切换用户前台桌面的情况下,启动 GUI 程序、枚举窗口,再通过 HWND 进行后台自动化。纯 aardio 封装 Win32 API,不依赖 .NET。

这不是 Windows 任务视图的虚拟桌面,也不是安全沙箱。dotNet.desktop 管理任务视图;本库管理 HDESK 桌面对象。

快速上手

下面示例会在私有桌面启动指定程序,枚举其窗口,然后强制终止本次启动的程序。请替换成专用于自动化测试的 EXE,不要用来处理尚未保存的工作。

import process.desktop;
import winex;

var desk,err = process.desktop();
if(!desk){ print(err); return; }

var p,err = desk.start("C:\path\your-app.exe");
if(!p){ desk.close(); print(err); return; }

// 类名、标题均可省略;传入 p 可限定进程,并在进程退出时提前结束等待。
var hwnd,tidOrErr = desk.wait(,,p,8000);
if(hwnd){
    for h,title,tid,pid in desk.each(,,p){
        print(h,title,tid,pid);
    }
    // 根据目标程序继续复用 winex:
    // var edit = winex.findEx(hwnd,,"Edit",,1011);
    // print(winex.getText(edit));
}
else print(tidOrErr);

// 业务完成或失败都应明确收尾;不需要强制终止时改用 desk.close()。
var cleaned,cleanupError = desk.dispose();
p.free();
if(!cleaned) print(cleanupError); // 失败时桌面仍可重试 dispose。

接口

接口 用途与返回值
process.desktop() 创建自动命名的私有桌面;失败返回 null,错误信息,Win32错误码
desk.start(exe,args,startInfo) 在本桌面启动进程,返回现有 process 对象
desk.list() 顶层 HWND 快照数组;正常空结果是 []
desk.each(cls,title,processOrPid) 快照迭代器,每次返回 hwnd,title,threadId,processId
desk.find(cls,title,processOrPid) 首个匹配窗口:hwnd,threadId,processId;未找到返回 null
desk.wait(cls,title,processOrPid,timeout=8000) 有限时等待;成功返回值同 find
desk.close() 关闭本库持有的桌面句柄和内部跟踪句柄,不终止进程
desk.dispose(timeout=2000) 强制终止 start 直接启动的进程,总限时等待后调用 close

desk.name 是自动生成的名称,desk.path 是 窗口站名\桌面名,desk.handle 是 HDESK 指针。这三个字段只读使用,不要修改或自行释放句柄。

启动

枚举、查找与等待

list/each/find/wait 出错时返回 null,错误信息[,Win32错误码]。直接用于 for ... in 时,迭代器创建失败会表现为没有迭代;需要区分错误时先取得迭代器:

var iterator,err = desk.each("目标窗口类名",,p);
if(!iterator){ print(err); return; }
for hwnd,title,tid,pid in iterator {
    print(hwnd,title);
}

清理与所有权

边界

Markdown 格式