调整,音乐模块

This commit is contained in:
zhongluofeng
2026-09-12 11:05:26 +08:00
parent 27ad5d89a5
commit d702ed0d31
71 changed files with 13647 additions and 387 deletions
+51
View File
@@ -10,6 +10,9 @@
//! - screenshot_show_overlay:一次 IPC 完成覆盖层 show + focus(关键路径减少往返)
//! - screenshot_enum_windows:枚举可见顶层窗口
//! - screenshot_capture_window:按 hwnd 捕获指定窗口
//! - screenshot_scroll_capture / screenshot_scroll_start / screenshot_scroll_finish /
//! screenshot_scroll_cancel:滚动截图(同步一次调用 / 会话式:启动、完成、取消)
//! - screenshot_set_scroll_hole:滚动模式遮罩挖孔(防 Chromium 遮挡检测冻结目标窗口)
//! - screenshot_take_editor_image_raw:取出编辑器图片(raw IPC,滚动截图会话直接写入)
//! - screenshot_compose_png / screenshot_compose_copyraw RGBA → PNG(仅编码 / 剪贴板+编码)
//! - screenshot_copy_image:写入剪贴板(CF_DIB
@@ -372,6 +375,54 @@ pub fn screenshot_scroll_cancel() -> Result<(), String> {
}
}
/// 滚动模式遮罩挖孔:在截图覆盖层窗口上挖出选区带的真孔(region = None 时复位整窗)。
///
/// Chromium 系浏览器(Edge/Chrome)的窗口遮挡检测会把被完全覆盖的窗口标记为
/// occluded 并暂停渲染——滚动截图时覆盖层铺满全屏,网页"看起来完全不滚动"。
/// 挖孔后目标窗口仅部分被覆盖,恢复渲染与滚轮响应(详见 capture::set_scroll_hole)。
/// 进入滚动模式时带选区调用,会话结束/新一轮截图开始时必须传 None 复位。
#[tauri::command]
#[specta::specta]
pub fn screenshot_set_scroll_hole(
app: AppHandle,
region: Option<super::ScrollRegion>,
) -> Result<(), String> {
#[cfg(windows)]
{
use raw_window_handle::HasWindowHandle;
let mut hwnds: Vec<isize> = Vec::new();
for (label, win) in app.webview_windows() {
if label.starts_with(crate::constants::windows::SCREENSHOT_OVERLAY) {
let hwnd = win
.window_handle()
.ok()
.and_then(|h| match h.as_raw() {
raw_window_handle::RawWindowHandle::Win32(w) => {
Some(w.hwnd.get() as isize)
}
_ => None,
});
if let Some(h) = hwnd {
hwnds.push(h);
}
}
}
if hwnds.is_empty() {
return Err("截图覆盖层窗口不存在".into());
}
for h in hwnds {
super::capture::set_scroll_hole(h, region)?;
}
Ok(())
}
#[cfg(not(windows))]
{
let _ = (app, region);
Ok(())
}
}
/// 取出编辑器图片(原始 PNG 字节,raw IPC → 前端 ArrayBuffer → Blob URL,取出即清除)
///
/// 长图(滚动截图)可达数十 MBraw IPC 相比 base64 JSON 事件传输省 ~33% 体积,