YStudio Y++

截图类

Y++ / YStudio 开发文档 · 一点滴

类对象支持库(不是扁平命令)。路径:支持库 → 扩展类库 → 截图类。

类型名必须写完整「截图类」。声明时自动创建,一般无需再调 创建截图()。

与基础库扁平命令 区域截图() 的区别:本类支持 框选、按窗口、含光标、多显示器、PNG/JPEG,并可用 置隐藏本进程 避免把自己拍进去。

硬约束

  1. 类型名必须写「截图类」。
  2. 返回值为图像字节集(默认 PNG),可直接 图片_写文件 / 图片框.图片 / 图片_写剪贴板。
  3. 框选() 须在界面线程调用。遮罩只负责拉框/移动/拉伸,不绘制确定/取消。无自定义工具窗时:Enter/双击确认,Esc/右键取消。自定义按钮见 开始框选。
  4. 受保护的全屏游戏 / DRM 画面可能是黑屏;UAC 安全桌面截不到。

快速开始

截图类 shot
shot.置含光标(真)
字节集 图 = shot.全屏()
如果 (图片_是否有效(图) == 假) {
    输出(shot.取错误())
} 否则 {
    shot.保存("桌面.png")
}

框选。不要把主窗口整窗当成工具窗。另做空白小窗,放自己的按钮(或绘制类,注意绘制叠层会盖住控件):

载入(框选工具条)
框选工具条.可见 = 假
shot.置隐藏本进程(真)
shot.置框选工具窗口(框选工具条.句柄)
shot.开始框选()

拉完选区后可用定时器把工具条设为可见(与 C++ 显示同步,避免 可见=假 把窗又藏回去):

函数 刷工具条可见 () {
    如果 (shot.是否已选区()) {
        框选工具条.可见 = 真
    } 否则 {
        框选工具条.可见 = 假
    }
}
绘制类 g_条画

函数 框选工具条.绘制 () {
    g_条画.绑窗口(框选工具条)
    g_条画.置填充("#FF007ACC")
    g_条画.画圆角矩形(8, 8, 90, 32, 4)
    g_条画.置填充("#FFFFFFFF")
    g_条画.画文本(34, 16, "确定")
}

函数 框选工具条.单击 (整数 x, 整数 y) {
    如果 (x >= 8 && x < 98 && y >= 8 && y < 40) {
        字节集 图 = shot.确认框选()
        框选工具条.可见 = 假
    }
}

绘制类叠层本身不能点选,要点击请写窗口 单击 做命中。拉框过程中工具条保持隐藏,松开选区后由运行时显示并贴在选区附近。

阻塞式(无自定义按钮、用手势确认):

字节集 图 = shot.框选()

延时截菜单:

字节集 图 = shot.延时框选(3000)

窗口:

整数 hwnd = 取前台窗口()
字节集 图 = shot.窗口(hwnd)
字节集 客户区 = shot.窗口(hwnd, 真)

截图类/创建

创建截图

  • 签名:截图类 创建截图()
  • 说明:一般直接写「截图类 shot」。

截图类/方法

全屏

  • 签名:字节集 全屏()
  • 说明:截取整个虚拟桌面(多显示器拼在一起)。

显示器

  • 签名:字节集 显示器([整数 索引=0])
  • 说明:截取指定显示器。索引从 0 起。

区域

  • 签名:字节集 区域(整数 X, 整数 Y, 整数 宽度, 整数 高度)
  • 说明:按屏幕坐标截矩形。宽/高 ≤0 时用虚拟屏尺寸。

窗口

  • 签名:字节集 窗口([整数 句柄=0], [逻辑 客户区=假])
  • 说明:句柄省略或 0 为前台窗口;客户区=真 则不含边框。被挡住的窗口尽量用 PrintWindow,失败则回退 BitBlt。

框选

  • 签名:字节集 框选()
  • 说明:阻塞。冻结桌面后单击窗口或拖动拉框,可移动/拉伸。遮罩不画任何按钮。无工具窗时 Enter/双击确认,Esc/右键取消(空字节集,取错误() 为「已取消框选」)。有 置框选工具窗口 时,可在等待期间点自己的按钮调用 确认框选 / 取消框选。

延时框选

  • 签名:字节集 延时框选([整数 毫秒=1000])
  • 说明:先等待再进入阻塞式框选(方便弹出菜单)。不改变 置延时。范围 0~120000。

开始框选

  • 签名:逻辑 开始框选()
  • 说明:非阻塞,显示遮罩后立即返回。须先把独立小工具条交给 置框选工具窗口(不要传主窗口)。

确认框选 / 取消框选 / 是否框选中 / 是否已选区

  • 签名:字节集 确认框选() · 逻辑 取消框选() · 逻辑 是否框选中() · 逻辑 是否已选区()
  • 说明:按当前选区出图 / 关闭遮罩 / 查询遮罩是否还在 / 是否已拉出有效选区(此时才应显示自己的确定/取消)。

置框选工具窗口

  • 签名:逻辑 置框选工具窗口([整数 句柄=0])
  • 说明:指定小工具条浮在遮罩之上且不被 置隐藏本进程 藏起。传主窗口会把整窗置顶,遮罩看起来像沉到窗口下面。0=不指定。

取框选矩形

  • 签名:整数数组 取框选矩形()
  • 说明:当前选区屏幕坐标:左、上、宽、高。未拉框时四个 0。

框选马赛克

  • 签名:逻辑 框选马赛克([整数 块大小=12])
  • 说明:把当前选区在冻结画面上打码。按钮、画笔都由 Y++ 窗口自己做;截完后也可用 图片_马赛克。

复制

  • 签名:逻辑 复制()
  • 说明:把最近一次成功截图写入剪贴板(位图 DIB;PNG 格式时另附 PNG)。须先截过图。

保存

  • 签名:逻辑 保存(文本 路径)
  • 说明:把最近一次成功截图按当前 置格式 写入文件。

另存为

  • 签名:逻辑 另存为()
  • 说明:可选系统保存对话框。分发应用若要自绘界面,用 保存文件对话框 + 保存(路径)。

置延时 / 取延时

  • 签名:逻辑 置延时([整数 毫秒=0]) · 整数 取延时()
  • 说明:全屏 / 显示器 / 区域 / 窗口 / 框选 在截取前等待。配合 置隐藏本进程 可先藏窗口再等菜单弹出。

置含光标 / 取含光标

  • 签名:逻辑 置含光标([逻辑 含=真]) · 逻辑 取含光标()
  • 说明:是否把鼠标指针画进图像。框选时画在松开时的位置。

置隐藏本进程 / 取隐藏本进程

  • 签名:逻辑 置隐藏本进程([逻辑 隐藏=真]) · 逻辑 取隐藏本进程()
  • 说明:截取前暂时隐藏本程序窗口,截完再显示。置框选工具窗口 指定的窗口不会被藏。

置格式 / 取格式

  • 签名:逻辑 置格式([文本 格式="png"]) · 文本 取格式()
  • 说明:png(默认)/ jpeg / jpg / bmp。

置JPEG质量 / 取JPEG质量

  • 签名:逻辑 置JPEG质量([整数 质量=85]) · 整数 取JPEG质量()
  • 说明:仅 JPEG 时生效,范围 1~100。

取显示器数

  • 签名:整数 取显示器数()

取显示器矩形

  • 签名:整数数组 取显示器矩形([整数 索引=0])
  • 说明:左、上、宽、高 四个整数。

取最后左边 / 取最后顶边 / 取最后宽度 / 取最后高度 / 取最后矩形

  • 说明:最近一次成功截图的屏幕矩形(框选取消不算成功)。

取错误

  • 签名:文本 取错误()
  • 说明:最近一次失败原因。

和现有命令的关系

能力 用法
只要一块矩形、BMP 基础库 区域截图() 仍可用
网页内容 浏览器控件 .捕获截图(路径)
截完处理 图片支持库:水印、缩放、剪贴板
窗口句柄 查找窗口 / 取前台窗口 / 主窗口.句柄

截长图(尚未实现)

当前 框选 / 全屏 / 窗口 都是 一次性 GDI 抓当前可见像素。页面里滚出屏幕的内容本来就不在显存里,所以不能靠把选区拉得很高来得到长图。

若以后单独做 长图()(不会塞进现有框选),典型做法是:

  1. 用户框出窗口内一块「视口」(或指定窗口客户区)。
  2. 循环:截当前视口 → 向目标窗口发送滚轮/WM_VSCROLL/PageDown → 等重绘 → 再截。
  3. 用相邻两帧重叠条带做对齐(应对滚动条、惯性滚动、未滚满一屏),再纵向拼成一张。
  4. 停止条件:到底、内容哈希不再变、或达到最大高度。

限制:无障碍滚动的窗口滚不动;网页需焦点在可滚控件上;画布虚拟列表可能重复/漏行;DRM/游戏同样黑屏。这和「录屏」不是同一条能力,也不会做进遮罩里的写死按钮。