首页 > 其他分享 >[AHK2] 截图工具之历史管理

[AHK2] 截图工具之历史管理

时间:2024-08-11 13:26:56浏览次数:6  
标签:截图 cur AHK2 backPool fileList id static fullPath 工具

开始

这是新版MeowPaste工程的第一篇博客,我将履行重写MeowPaste的承诺,使它更好用,代码更优雅。

MeowPaste是ahk编写的截图工具,目标是轻量且优雅

这次我们来重写历史图片管理,先前的版本太偏执,十分混乱。

需要的功能如下:

  • 热键贴出历史图片,按时间顺序贴出
  • 贴出的图如果关闭了,将放到重用池中,在下次优先贴出
  • 如果程序启动间截图产生或销毁删除了图片,要能够适应
  • 如果程序外部删除了图片,也要适应

实现

我的想法是:

  • 先读取文件列表
  • 当脚本新增图片时存入列表
  • 删除时将列表的数据删除、
  • 读取列表中文件时判断数据和文件是否存在,不存在则读取列表中下一条,直到找到为止。

我们需要三个变量:

  • fileList 存储文件列表
  • backPool 存储关闭的贴图id,将优先读取
  • cur 指向当前文件在fileList中的下标
static fileList := [], backPool := [], cur := -1

具体的说:
在程序启动时读取历史目录中图片列表,之后不再读取(尽可能减少io)。

读取的列表按时间倒序存入数组(新的在数组末尾)。

  static Init(_dir, _match := '*.bmp') {
    l := this.fileList
    ; 时间倒序(默认就是)存入
    FS.ReadDir(_dir, Noop, fullPath => l.Push(fullPath), _match)
    this.cur := l.Length
  }

使用倒序,则新增文件是添加到数组末尾,可以保证cur不会被干扰。


  • 增加文件时向数组末尾添加文件,同时向池中添加此id,保证在下次贴图时优先。
  • 删除时使用delete()删除数组数据,这个方法不会改变数组长度。
static AddFile(fileName) {
    this.fileList.Push(fileName), this.backPool.Push(this.fileList.Length)
  }

static DelFile(id) => this.fileList.Delete(id) ; not removeAt
static ReturnToPool(id) => this.backPool.Push(id)

最后是关键的读取方法:

static Consume() {
  if this.cur = -1
    throw Error('未初始化')
  if this.backPool.Length {
    id := this.backPool.Pop()
    if this.fileList.Has(id)
      fullPath := this.fileList[id]
    else {
      logger.Debug('返回池中存放已销毁')
      return History.Consume()
    }
  } else {
    if this.cur = 0 {
      return
    } else {
      id := this.cur, fullPath := this.fileList[this.cur--]
    }
  }
  if !FileExist(fullPath) {
    logger.Debug('外部删除了文件:' fullPath)
    return History.Consume()
  }
  return { id: id, fullPath: fullPath }
}

里面使用递归,直到找到有效的文件为止,这样就解决了外部删除的问题。

完整代码

Include文件见仓库ahk-lib

当然,现在是看不出什么名堂的,当与贴图结合在一起才会感觉到它的好用。
我在旧工程中使用了它,感觉相当不错!

#Requires AutoHotkey v2.0
#Include g:\AHK\git-ahk-lib\util\Fs.ahk

class History {

  static fileList := [], backPool := [], cur := -1

  static Init(_dir, _match := '*.bmp') {
    l := this.fileList
    FS.ReadDir(_dir, Noop, fullPath => l.Push(fullPath), _match)
    this.cur := l.Length
  }

  static Reset() {
    this.cur := this.fileList.Length, this.backPool := []
  }

  static AddFile(fileName) {
    this.fileList.Push(fileName), this.backPool.Push(this.fileList.Length)
  }

  static DelFile(id) => this.fileList.Delete(id) ; not removeAt
  static ReturnToPool(id) => this.backPool.Push(id)

  static Consume() {
    if this.cur = -1
      throw Error('未初始化')
    if this.backPool.Length {
      id := this.backPool.Pop()
      if this.fileList.Has(id)
        fullPath := this.fileList[id]
      else {
        logger.Debug('返回池中存放已销毁')
        return History.Consume()
      }
    } else {
      if this.cur = 0 {
        return
      } else {
        id := this.cur, fullPath := this.fileList[this.cur--]
      }
    }
    if !FileExist(fullPath) {
      logger.Debug('外部删除了文件:' fullPath)
      return History.Consume()
    }
    return { id: id, fullPath: fullPath }
  }
}

标签:截图,cur,AHK2,backPool,fileList,id,static,fullPath,工具
From: https://www.cnblogs.com/refiz/p/18353280

相关文章

  • 开发者工具Postman接口测试工具使用介绍
    Postman接口测试工具详解Postman是一个功能强大的API测试工具,广泛应用于接口开发和测试过程中。它提供了一个直观的界面来创建、发送和管理API请求,并可以轻松地检查响应。以下是Postman的详细使用指南,包括基本概念、功能和操作步骤。安装和设置安装Postman下载:......
  • BUUCTF 81题吹着贝斯的二维码详解(包含各类工具和python脚本)
    在网上看了很多类似解题步骤和说明,感觉对小白都不友好,于是决定搜集整理下,做个详尽的解题步骤:压缩包解压得到36个无后缀名文件和一个flag.zip压缩包再看压缩包,解压发现有压缩密码,用winhex查看是不是伪加密,在末尾发现一串可疑字符串,拷贝下来留用:GNATOMJVIQZUKNJXGRCTGNRTG......
  • Buuctf 弱口令详解附送图片隐写工具cloacked-pixel安装配置使用实列
    下载一个zip压缩包,解压需要密码,使用bandizip,打开看看,发现注释栏有一些隐藏的东西ctl+c复制在粘贴板,再ctl+v黏贴到sunblime文本编辑软件下是摩斯密码,记录下来......-...-..-----..-.---.-...---在线摩斯密码翻译器HELL0FORUM用此作为密码解压压缩包......
  • 节假日配置初始化 redis缓存方案及@PostConstruct注解,Cache方案GuavaUtils.java工具类
    节假日配置初始化redis缓存方案及@PostConstruct注解,Cache方案GuavaUtils.java工具类启动报错:本机,在jenkins上面没有报错?包括嵌套的注入Beanjava静态代码块和spring@value等注解注入顺序https://www.cnblogs.com/oktokeep/p/15530697.html/***节假日配置初始化redis缓存......
  • 什么是 PPA?详解 Ubuntu 软件安装的强大工具
    在Linux世界中,尤其是Ubuntu和其他基于Debian的发行版,用户通常通过官方软件仓库来安装和管理软件。然而,有时官方仓库中的软件版本可能较旧,或者根本没有你想要的软件。在这种情况下,PPA(PersonalPackageArchive,个人软件包档案)为用户提供了一种灵活且方便的方式来获取最新的......
  • Lua语言基础学习:安装Lua和Lua库管理工具
     Lua语言简介  Lua是一种轻量、高效、可嵌入的脚本语言,由巴西里约热内卢天主教大学的研究小组于1993年开发,Lua的解释器非常小巧,编译后的体积很小(如完整解释器不过200KB),这使得它非常适合嵌入到其他应用程序中。Lua的执行速度快,内存占用低,特别适用于需要高性能的应用场景,支......
  • Java工具类封装微服务间HTTP通信
    在微服务架构中,服务之间通常通过HTTP协议进行通信。为了简化这一过程,我们可以创建一些工具类来封装HTTP请求的发送逻辑。本篇文章将介绍如何使用Java来创建这样的工具类,并分别演示使用ApacheHttpClient和SpringFramework中的RestTemplate来发送HTTPGET请求的方法。1.引言......
  • 【云原生之kubernetes实战】在k8s环境下部署Note Mark笔记工具
    【云原生之kubernetes实战】在k8s环境下部署NoteMark笔记工具一、NoteMark介绍1.1NoteMark简介1.2NoteMark特点1.3NoteMark使用场景二、本次实践介绍2.1本次实践简介2.2本次环境规划2.2k8s存储介绍三、检查k8s环境3.1检查工作节点状态3......
  • 封装一个批量加载图片的工具类
    遇到一个面试题,把其中一部分功能单独封装了一个批量加载图片的class。斗胆擅自加了一点功能,1、配置第一批同时发起load的图片数量(默认5张)。2、无论成败,每结束一张图片加载自动加载下一张。3、每张图片右侧实时展示目前加载状态(ready,pendding,success,failed)。代码还在完善......
  • PicTech AI免费在线图片翻译工具及使用说明收藏
    名称:PicTechAI免费在线图片翻译网址:https://www.pictech.cc/PicTech免费在线图片翻译,您只需轻点一下鼠标,就能够轻松准确地将图片中的文本翻译成目标语言,清晰度高,为跨境电商企业提供了不可或缺的工具。介绍:PicTech免费在线图片翻译,您只需轻点一下鼠标,就能轻松完成。能够轻松准......