LenoApp——屏幕划词,无感翻译

leno.png

LenoApp

屏幕划词,无感翻译。

简介

Leno,意即“沙罗”,类似于一种薄纱一样的织物。Leno查词就像这样一种似有似无的查词软件。

本来有道词典的划词翻译非常好用,但是总是会在勾选词边上显示一个搜索图标,个人觉得不够简洁。

另外很多时候,我们只是需要简单了解一个单词的中文含义,不需要其他详尽的用法等内容,此时就想要一个简洁的查词软件。

我其实想让整个程序作为一个很小的窗口,甚至是半透明的,隐藏在角落里,实时地查询想查的单词,实现无感查词。

即我想查的时候能很快找到,不想查的时候不要出现。(有点像渣男啊)

这就是我想做的,然而还有很多等待优化的地方,不过已经基本实现了全链路的功能。

使用

本软件是使用WPF Framework开发的,采用了Fluent设计,所以目前只能在Windows10上运行(实际上我没有在其他机器上测试过hhh)。

本项目是源代码,下载到本地后,用VS打开,生成release就可以使用了。

运行LenoApp.exe文件,就直接把小窗口移到屏幕角落,遇到想查的词,直接勾选,Leno就会自动查找了。

实现

实际上整个软件最麻烦的就是“屏幕划词”,如何从屏幕上取到文字?

我查找了一些资料,没找到Windows提供了能直接获取文字的接口,也没找到有道词典的技术实现。

现有的实现了屏幕取词的大致分几种:一是重绘窗体,确定鼠标位置的可勾选文字;二是获取鼠标附近的像素点,通过类似OCR的方式获取文字;三是“曲线救国”的方式,就是借用剪贴板获取文字。前两种稍显复杂,第三种最好实现,Leno即是。

Leno查词在内部的技术实现主要分3步:

  1. 用Hook钩子,监控鼠标和键盘的特定操作(勾选到文字)
  2. 出现特定操作后,用keybd_event()函数模拟Ctrl+C操作,实际上就是复制勾选到的文字到剪贴板
  3. 从剪贴板获取复制到的文字,完成查词

监控鼠标键盘的部分,我借用了ZZRRegion的项目Hook,这个项目比较完整,基本实现了所有功能(但是双击鼠标好像有点问题)。

模拟Ctrl+C操作,这里会出现的一个问题是模拟Ctrl+C操作后马上去获取剪贴板内容是拿不到的,可能是没有反应过来吧,所以要Sleep一会儿。CSDN博客《windows下的屏幕划词》有讲。

keybd_event((byte)Keys.ControlKey, 0, 0, 0);//模拟按下ctrl
keybd_event((byte)Keys.C, 0, 0, 0);//模拟按下c
keybd_event((byte)Keys.ControlKey, 0, 2, 0);//模拟松开ctrl
keybd_event((byte)Keys.C, 0, 2, 0);//模拟松开c

查词的来源是我自己做了一个非常简单的服务接口,词源是1eez的项目103976,大概有103520个词。

可以通过这个接口访问:http://www.crazyphilip.space:8092/Search/love

截图

运行截图

有待优化

没花多少时间做,bug其实蛮多的,比较粗糙。例如屏幕取词还不是很流畅,不能完全做到无感。

  1. 我在实现的时候,特定操作是松开鼠标左键。理论上想的是按下鼠标左键->移动鼠标勾选单词->松开左键->触发Ctrl+C操作就完成了取词,此时复制文字没有问题。

    但是任何时候按下松开鼠标左键都会触发Ctrl+C,操作不够细腻,容易出现大量误操作。

  2. 词量不多,词意不够。设计的是模糊搜索,就是形近的单词都会查找,形成一个列表。所以输入框下面的控件实际上是一个列表。
    量误操作。

  3. 词量不多,词意不够。设计的是模糊搜索,就是形近的单词都会查找,形成一个列表。所以输入框下面的控件实际上是一个列表。

GitHub仓库:LenoApp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值