前言

为了进一步提高开发工作效率,最近我们基于 electron 开发了一款媲美 uTools 的开源工具箱 rubick。该工具箱不仅仅开源,最重要的是可以使用 uTools 生态内所有开源插件!这将是巨大的能力,意味着 uTools 生态内所有插件可以无差异化使用到 rubick 中。

设计交互上为了更能提高用户的使用效率,我们又尝试去实现了 uTools 中非常优秀的一些设计,比如:全局取色和截屏。全局取色在获取一些图片、其他App应用的颜色时非常有用。截屏虽然可以使用钉钉或者微信自带的截图功能,但是为了更加符合 uTools 用户习惯,我们也顺便实现了一下。

接下来进入主题,我们来基于 rubick 来一步步实现一个取色和截屏能力。

代码仓库

Rubick github

功能演示:

实现取色

要实现屏幕取色能力,主要核心能力步骤如下:

  1. 跟随鼠标移动,获取当前屏幕鼠标位置
  2. 获取当前坐标的颜色

1. 获取鼠标移动的坐标

要获取系统鼠标移动的坐标,electron 本身没有提供相关的函数和能力,所以要实现跟随获取系统鼠标位置,可能要调用原生能力。好在有一个 iohook 这样一个强大的系统调用工具,可以帮助我们监听系统鼠标操作以及按键操作。所以我们可以基于 iohook 来实现位置坐标获取。在 electron 中按照 iohook,在 npm install iohook 之前,需要在 package.json 中配置:

"iohook": {
"targets": [
"node-72",
"electron-85"
],
"platforms": [
"win32",
"darwin",
"linux"
],
"arches": [
"x64",
"ia32"
]
}

后面在 install 的时候会为我们按照所需下载通过 node-gyp 编译好的 node 可调用的包。如果需要重新编译,需要再重新执行命令:

"rebuild": "npm rebuild --runtime=electron --target=5.0.0 --disturl=https://atom.io/download/atom-shell --abi=80"

具体需要哪个版本的 nodeelectron 可以参考这篇文章

准备工作做完之后,接下来就是调用 iohook 获取鼠标移动位置:

 ioHook.on('mousemove', ({x, y}) => {
// todo
})

2. 获取当前坐标位置颜色

这里,需要利用到另一个库 robotjs,该库提供了强大的系统操作能力,最最最重要的是他可以获取到像素点的色彩,这就很关键了。这个正好是我们需要的:

 let color = "#" + robot.getPixelColor(parseInt(x), parseInt(y));

到这里就基本上完成了。

另一种实现方案

上面是一种比较常规的做法,但除了上面的方式,还有没有其他的方式呢?当时我也想了很久,后来仔细想想,electron 虽然获取不到系统鼠标位置和点击以及系统级别的像素,但是如果我们的屏幕本身就是一个 electronbrowserWindow 那就可以通过 DOM 来实现啦!

确实这是一个思路,核心步骤拆解下来就是:

  1. 根据当前显示器个数渲染对应个数 browserWindow
  2. 每个 browserWindow 尺寸设置成透明全屏的
  3. 获取每个 screen 的全屏截图
  4. 绘制截图到 browserWindow 的 canvas 上
  5. 从系统级操作转成 electron 内部操作

具体的实现方式这里就不细说,因为下面截屏采用的就是这种方案。

实现系统截屏

系统截屏就可以参考上面所述,采用分屏渲染子窗口,再操作子窗口的方式来实现,这里我也是参考了:从零开始用 electron 手撸一个截屏工具

最后

本篇主要介绍如何实现一个类似于 utools 的取色、截屏能力,当然这远远不是 utools 的全部,下期我们再继续介绍如何实现 utools 其他能力。欢迎大家前往体验 Rubick 有问题可以随时提 issue 我们会及时反馈。

另外,如果觉得设计实现思路对你有用,也欢迎给个 Star:https://github.com/clouDr-f2e/rubick

徒手从零实现 uTools 系列(三)- 屏幕取色和截屏的更多相关文章

  1. JavaScript零基础学习系列三

    函数 函数:为了完成某个功能而定义的代码的集体.函数是数据类型,只读的对象:函数也是对象:代码的重用.(JavaScript中) 定义语法:function 函数名(形式参数1,形式参数2--){ / ...

  2. 纯C#实现屏幕指定区域截屏

    以前在别的地方见过一个通过调用系统API实现屏幕截图的例子,从内心来说我不太喜欢在C#代码中出现这种情况,现在什么都讲“和谐”,我觉得这种做法就是破坏了我们的“和谐”代码,呵呵,开玩笑,有的时候,不通 ...

  3. C#实现屏幕指定区域截屏

    //string Opath = @"C:/Picture";            //if (Opath.Substring(Opath.Length - 1, 1) != @ ...

  4. iOS中的截屏(屏幕截屏及scrollView或tableView的全部截屏)

    iOS中的截屏(屏幕截屏及scrollView或tableView的全部截屏) 2017.03.16 12:18* 字数 52 阅读 563评论 4喜欢 2 1. 截取屏幕尺寸大小的图片并保存至相册 ...

  5. IM开发者的零基础通信技术入门(三):国人通信方式的百年变迁

    [来源申明]本文原文来自:微信公众号“鲜枣课堂”,官方网站:xzclass.com,原题为:<中国通信的百年沉浮>,本文引用时已征得原作者同意.为了更好的内容呈现,即时通讯网在收录时内容有 ...

  6. 【JAVA零基础入门系列】Day8 Java的控制流程

    什么是控制流程?简单来说就是控制程序运行逻辑的,因为程序一般而言不会直接一步运行到底,而是需要加上一些判断,一些循环等等.举个栗子,就好比你准备出门买个苹果,把这个过程当成程序的话,可能需要先判断一下 ...

  7. 【JAVA零基础入门系列】Day10 Java中的数组

    什么是数组?顾名思义,就是数据的组合,把一些相同类型的数放到一组里去. 那为什么要用数组呢?比如需要统计全班同学的成绩的时候,如果给班上50个同学的成绩信息都命名一个变量进行存储,显然不方便,而且在做 ...

  8. 【JAVA零基础入门系列】Day11 Java中的类和对象

    今天要说的是Java中两个非常重要的概念--类和对象. 什么是类,什么又是对象呢?类是对特定集合的概括描述,比如,人,这个类,外观特征上,有名字,有年龄,能说话,能吃饭等等,这是我们作为人类的相同特征 ...

  9. 【JAVA零基础入门系列】Day13 Java类的继承与多态

    继承是类的一个很重要的特性,什么?你连继承都不知道?你是想气死爸爸好继承爸爸的遗产吗?(滑稽) 开个玩笑,这里的继承跟我们现实生活的中继承还是有很大区别的,一个类可以继承另一个类,继承的内容包括属性跟 ...

随机推荐

  1. && echo suss! || echo failed

    ### && echo suss! || echo failed 加在bash后 ########ls /proc && echo suss! || echo fail ...

  2. Phoenix 使用教程

    引言 hbase 提供很方便的 shell 脚本,可以对数据表进行 CURD 操作,但是毕竟是有一定的学习成本的,基本上对于开发来讲,sql 语句都是看家本领,那么,有没有一种方法可以把 sql 语句 ...

  3. KEIL中查看程序存储空间的大小

    Program Size: Code=86496 RO-data=9064 RW-data=1452 ZI-data=16116 Code是代码占用的空间,RO-data是 Read Only 只读常 ...

  4. 8.模块定义导入优化time datetime内置模块

    1.模块(module)的定义:本质就是.py的python文件用来从逻辑上组织python代码(变量\函数\类\逻辑:实现一个功能)包(package)的定义:用来从逻辑上组织模块的,本质就是一个文 ...

  5. Nginx|Apache目录权限禁止执行PHP设置

    Ngnix: location ~ /upload/.*.(php|php5)?$ { deny all; } 这就是禁止upload内执行php,但是图片可以打开哦 多目录禁止: location ...

  6. 【Microstation】三维建模基础及软件入门到精通实验教程目录

    @ 目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 MicroStation是一款非常不错的二维和三维设计软件,由奔特力(Bentley)工程软件系统有限公司开发的一款软件.在C ...

  7. MVC、MVP和MVVM的区别

    前言 在web1.0时代时,那个时候程序猿还没有前后端之分,更程序员开发的时候,都是要前后端一起写的,前后端的代码都是杂揉在一起,如图下 这种开发模式的话,开发的时候因为不需要和其他人员沟通协作,前后 ...

  8. 在 Visual Studio 里一秒打开 ILSpy,并反编译当前项目

    下载 ILSpy(如果已有 ILSpy,忽略此步骤) 1.打开官方git 仓库 - https://github.com/icsharpcode/ILSpy 2.点击右侧的 Releases 最新版, ...

  9. Jmeter- 笔记7 - 服务器监控(ServerAgent配置)

    文件:ServerAgent - 2.2.3.zip  放网盘了 在服务器的操作:只需要把这个文件上传到被监控服务器,然后解压,启动sh startagent.sh --udp-port 0 --tc ...

  10. setTimeout使用问题

    通常禁止使用setTimeout的情况: 1.不能用于模拟异步,有的人不熟悉异步流程,而使用setTimeout伪实现,比如设置一个 setTimeout 来等待函数执行完毕,正确做法是使用回调来处理 ...