优化代码
This commit is contained in:
1 parent
3553790475
commit
eda7e8bc96
23 files changed
+3113
-342
No files matched your search
@@ -0,0 +1,102 @@
|
||||
package ui
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
"sync"
|
||||
|
||||
"viewsagent/internal/capture"
|
||||
"viewsagent/internal/win32"
|
||||
)
|
||||
|
||||
// regionFrame 是常驻的取景框提示。
|
||||
//
|
||||
// 屏幕上一直显示当前框选区域的红框,让使用者随时知道自己在看哪一块;
|
||||
// 这个框被 SetWindowDisplayAffinity 排除在截屏与录屏之外,
|
||||
// 所以模型看到的画面、录屏软件录到的画面里都不会有它。
|
||||
type regionFrame struct {
|
||||
frame *win32.Frame
|
||||
|
||||
mu sync.Mutex
|
||||
last capture.Region
|
||||
hasLast bool
|
||||
suspended bool
|
||||
}
|
||||
|
||||
// newRegionFrame 创建取景框。创建失败时返回 nil,调用方自行决定是否降级。
|
||||
func newRegionFrame() *regionFrame {
|
||||
f, err := win32.NewFrame()
|
||||
if err != nil {
|
||||
slog.Warn("取景框创建失败,屏幕将不再显示选区边框", "err", err)
|
||||
return nil
|
||||
}
|
||||
return ®ionFrame{frame: f}
|
||||
}
|
||||
|
||||
// apply 把取景框移到指定区域;区域无效时隐藏。
|
||||
func (f *regionFrame) apply(r capture.Region) {
|
||||
if f == nil {
|
||||
return
|
||||
}
|
||||
f.mu.Lock()
|
||||
if f.suspended {
|
||||
f.mu.Unlock()
|
||||
return
|
||||
}
|
||||
if f.hasLast && f.last == r {
|
||||
f.mu.Unlock()
|
||||
return
|
||||
}
|
||||
f.last = r
|
||||
f.hasLast = true
|
||||
f.mu.Unlock()
|
||||
|
||||
if !r.Valid() {
|
||||
f.frame.Hide()
|
||||
return
|
||||
}
|
||||
f.frame.SetRegion(win32.Rect{
|
||||
Left: r.X,
|
||||
Top: r.Y,
|
||||
Right: r.X + r.W,
|
||||
Bottom: r.Y + r.H,
|
||||
})
|
||||
}
|
||||
|
||||
// suspend 临时隐藏取景框(框选过程中全屏有选区浮层,避免两层边框打架)。
|
||||
func (f *regionFrame) suspend() {
|
||||
if f == nil {
|
||||
return
|
||||
}
|
||||
f.mu.Lock()
|
||||
f.suspended = true
|
||||
f.hasLast = false
|
||||
f.mu.Unlock()
|
||||
f.frame.Hide()
|
||||
}
|
||||
|
||||
// resume 恢复取景框,并按当前区域重新落位。
|
||||
func (f *regionFrame) resume(r capture.Region) {
|
||||
if f == nil {
|
||||
return
|
||||
}
|
||||
f.mu.Lock()
|
||||
f.suspended = false
|
||||
f.mu.Unlock()
|
||||
f.apply(r)
|
||||
}
|
||||
|
||||
// close 销毁取景框窗口。
|
||||
func (f *regionFrame) close() {
|
||||
if f == nil {
|
||||
return
|
||||
}
|
||||
f.frame.Close()
|
||||
}
|
||||
|
||||
// Debug 返回取景框内部状态,供自检使用。
|
||||
func (f *regionFrame) Debug() string {
|
||||
if f == nil || f.frame == nil {
|
||||
return "取景框未创建"
|
||||
}
|
||||
return f.frame.Debug()
|
||||
}
|
||||
Reference in new issue
Block a user