taojy123 / KeymouseGo

类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input
http://taojy123.github.io/KeymouseGo
GNU General Public License v2.0
7.15k stars 1.04k forks source link

跨平台支持 #129

Closed Monomux closed 2 years ago

Monomux commented 2 years ago

从3.0版本开始软件就不支持跨平台了,一直有点遗憾,用PySide2重写UI也是因为看到了很久远的issue #24 #31

我对此的想法是“功能插件化”,即将录制功能封装为一个类,键鼠模拟执行功能封装为一个类(现在已经做到了),设置抽象类规范接口。由程序动态加载模块,调用接口实现相应功能。

基于windows平台下的功能实现已经做的很完善了,如果要做别的平台的支持,只需要再写一个相应的类,在其中实现功能接口即可,不需要改动已经写好的部分。

找了一些相关的跨平台库:

keyboard mouse pyautogui pynput
键盘监听 × ×
鼠标监听 × 功能有限
键盘模拟 ×
鼠标模拟 ×
ZutJoe commented 2 years ago

这个我们自己写会不会好一点,不通过插件,但是避免不了踩坑了😂

Monomux commented 2 years ago

这个我们自己写会不会好一点,不通过插件

你的意思是再写一个具有相关功能的软件?

ZutJoe commented 2 years ago

这个我们自己写会不会好一点,不通过插件

你的意思是再写一个具有相关功能的软件?

把项目重写?哈哈哈

ZutJoe commented 2 years ago

而且我也对那个KeymouseGo.py文件很多类写在一起有点嫌弃😂,可能写java比较多,觉得一个文件里的类不能太多,哈哈哈

Monomux commented 2 years ago

其实我尝试用Java写过一个半吊子的仿品,虽然造轮子的过程中也能学到一些东西,但总感觉还是改进已有的会更好一点。除非自己能写个更好的(现在我做不到😂)。

ZutJoe commented 2 years ago

其实我尝试用Java写过一个半吊子的仿品,虽然造轮子的过程中也能学到一些东西,但总感觉还是改进已有的会更好一点。除非自己能写个更好的(现在我做不到😂)。

确实,哈哈哈哈

zhsunlight commented 2 years ago

我对此的想法是“功能插件化”,即将录制功能封装为一个类,键鼠模拟执行功能封装为一个类(现在已经做到了),设置抽象类规范接口。由程序动态加载模块,调用接口实现相应功能。

这个方案很好。将与平台无关的功能组织在一起作为KeymouseGo的基础,再将必须与平台相关的部分插件化,在不同平台运行时,加载对应平台的插件,这样可以实现跨平台运行。但有个问题,那些与平台相关的插件依赖包该如何处理?比如windows下需要pywin32包,将这个与键鼠插件放一起吗?

另一个期待的特性是在脚本执行时,想停就停,想执行就执行(这个已经实现),现在是想停,很多时候并不是马上就停,等真正停的时候,键鼠还是会执行相应的动作。所以有时当我找到脚本问题后,马上按停止键,然后去修改脚本,过一会,脚本真的要停了,接着一通胡乱的键鼠操作下来,代码就被弄得非常乱,好在我的编辑器还算给力,按几次ctrl+z就恢复原状。不知道 python3.4之后提供的异步IO有没有可能改善这个问题。(参考资料:https://zhuanlan.zhihu.com/p/95685688

相比于同类软件,KeymouseGo安装容易(纯绿色,下载一个文件即可运行)、操作简单(即录即运行)、可扩展性强(从录制到运行,都可以深度定制,与人工智能,OCR等对接后,可以实现大量收费软件也无法企及的需求)

zhsunlight commented 2 years ago

而且我也对那个KeymouseGo.py文件很多类写在一起有点嫌弃😂,可能写java比较多,觉得一个文件里的类不能太多,哈哈哈

这个是写python代码的一种习惯,能减少寻找需要引用类的时间。如果一个类写一个文件,文件开头就要写一大串的 import,没有AS这类智能编辑器自动导入的功能,人手写一大串 import 的体验并不好。

ZutJoe commented 2 years ago

而且我也对那个KeymouseGo.py文件很多类写在一起有点嫌弃😂,可能写java比较多,觉得一个文件里的类不能太多,哈哈哈

这个是写python代码的一种习惯,能减少寻找需要引用类的时间。如果一个类写一个文件,文件开头就要写一大串的 import,没有AS这类智能编辑器自动导入的功能,人手写一大串 import 的体验并不好。

AS是auto search吗? 那为啥Java是那种形式呢,python是因为找引用文件慢吗

ZutJoe commented 2 years ago

而且我也对那个KeymouseGo.py文件很多类写在一起有点嫌弃😂,可能写java比较多,觉得一个文件里的类不能太多,哈哈哈

这个是写python代码的一种习惯,能减少寻找需要引用类的时间。如果一个类写一个文件,文件开头就要写一大串的 import,没有AS这类智能编辑器自动导入的功能,人手写一大串 import 的体验并不好。

可是如果通过插件的形式,那不同的系统,需要写几份相同逻辑的代码,那为啥不直接从根本上解决呢

zhsunlight commented 2 years ago

AS是auto search吗?

我指的是 Android Studio Android Studio 编辑器可以智能添加包,这点非常方便。 但python代码编辑器没有这样的功能,或者只是我没有找到这样的编辑器。

ZutJoe commented 2 years ago

我指的是 Android Studio Android Studio 编辑器可以智能添加包,这点非常方便。 但python代码编辑器没有这样的功能,或者只是我没有找到这样的编辑器。

Jetbrains公司家的ide都能(好像,我用的几款都能)😂

zhsunlight commented 2 years ago

可是如果通过插件的形式,那不同的系统,需要写几份相同逻辑的代码,那为啥不直接从根本上解决呢

你说的是指 KeymouseGo 可以不采用插件方案,而从根本上解决问题吗?这个你要具体说说如何做,目前确实没有更好的方案。完全重写一套新的,不在这里的讨论范围。

我觉得吧,KeymouseGo 在保持现有简单、易用特点基础上,夯实底层基础(如跨平台支持,异步执行支持等),为实现 RPA 提供支持是未来发展方向。

RPA参考资料: RPA进阶(一):走近 RPA 世界 https://blog.csdn.net/sunhuaqiang1/article/details/106119764

Monomux commented 2 years ago

可是如果通过插件的形式,那不同的系统,需要写几份相同逻辑的代码,那为啥不直接从根本上解决呢

其实我觉得一旦牵扯到跨平台,重新实现相同的逻辑是不可避免的,只是重写该由谁完成的问题。以上面表格里的mouse库为例,看一下源码的__init__.py

import platform as _platform
if _platform.system() == 'Windows':
    from. import _winmouse as _os_mouse
elif _platform.system() == 'Linux':
    from. import _nixmouse as _os_mouse
elif _platform.system() == 'Darwin':
    from. import _darwinmouse as _os_mouse
else:
    raise OSError("Unsupported platform '{}'".format(_platform.system()))

其实它内部也做了针对不同平台的实现,导入模块时,根据当前的操作系统选择相应的模块。

那么,对于本项目来说,直接引用这些跨平台的库来实现功能肯定是最轻松的,因为不需要针对不同的平台进行适配,KeymouseGo在2.x版本就使用了pynput实现功能。但是现在的程序就主要功能的实现而言是“稳定”的,对于在windows平台上的使用而言,如果改用其它库再实现一遍,可能又需要考虑很多问题,我觉得从“稳定”的角度上看,在windows平台上继续维护现有的实现就可以了。而对其它平台的支持则可以用跨平台的库来实现,由于库本身就是跨平台的,因此只需要重写一次功能的实现。并且由于此前程序并不支持跨平台,也不存在在其它平台下的“稳定性”这一概念。对于新平台用户而言,遇到了平台特定的问题,只需要修改跨平台功能实现模块即可,对windows环境下的使用不会造成很大的影响。

引入第三方库后,维护难易度又是一个问题(参考较早的issue),如果第三方库本身存在一些问题,对程序的使用造成了影响,则需要向上游仓库提交issue,参与解决问题。

ZutJoe commented 2 years ago

你说的是指 KeymouseGo 可以不采用插件方案,而从根本上解决问题吗?这个你要具体说说如何做,目前确实没有更好的方案。完全重写一套新的,不在这里的讨论范围。

我觉得吧,KeymouseGo 在保持现有简单、易用特点基础上,夯实底层基础(如跨平台支持,异步执行支持等),为实现 RPA 提供支持是未来发展方向。

RPA参考资料: RPA进阶(一):走近 RPA 世界 https://blog.csdn.net/sunhuaqiang1/article/details/106119764

好的,谢谢

ZutJoe commented 2 years ago

其实我觉得一旦牵扯到跨平台,重新实现相同的逻辑是不可避免的,只是重写该由谁完成的问题。以上面表格里的mouse库为例,看一下源码的__init__.py

import platform as _platform
if _platform.system() == 'Windows':
    from. import _winmouse as _os_mouse
elif _platform.system() == 'Linux':
    from. import _nixmouse as _os_mouse
elif _platform.system() == 'Darwin':
    from. import _darwinmouse as _os_mouse
else:
    raise OSError("Unsupported platform '{}'".format(_platform.system()))

其实它内部也做了针对不同平台的实现,导入模块时,根据当前的操作系统选择相应的模块。然后点开针对各平台的实现,其中的pressrelease这类函数都可以看作接口,用户使用时只需要调用mouse.press就可以实现按下鼠标的功能而不用在意底层是如何实现的。

那么,对于本项目来说,直接引用这些跨平台的库来实现功能肯定是最轻松的,因为不需要针对不同的平台进行适配,KeymouseGo在2.x版本就使用了pynput实现功能。但是现在的程序就主要功能的实现而言是“稳定”的,对于在windows平台上的使用而言,如果改用其它库再实现一遍,可能又需要考虑很多问题,我觉得从“稳定”的角度上看,在windows平台上继续维护现有的实现就可以了。而对其它平台的支持则可以用跨平台的库来实现,由于库本身就是跨平台的,因此只需要重写一次功能的实现。并且由于此前程序并不支持跨平台,也不存在在其它平台下的“稳定性”这一概念。对于新平台用户而言,遇到了平台特定的问题,只需要修改跨平台功能实现模块即可,对windows环境下的使用不会造成很大的影响。

引入第三方库后,维护难易度又是一个问题(参考较早的issue),如果第三方库本身存在一些问题,对程序的使用造成了影响,则需要向上游仓库提交issue,参与解决问题。

嗯嗯,或许这个样子更好,如果我没有理解错的话就是在已有的基础上做扩展而不是再“重新造一个”

Monomux commented 2 years ago

我在以下环境测试新的特性 系统: Debian 11 桌面: KDE Plasma 5.20.5

由于mouse库的监听需要root权限而pynput不需要,所以键鼠监听暂时采用了pynput。由于测试时pynput无法模拟鼠标操作(原因未深究),键鼠模拟使用pyautogui库。

经测试程序能完成大部分的操作,但存在以下问题:

看了一下pynput的源码,似乎在linux和mac系统下不支持鼠标侧键的录制

Monomux commented 2 years ago

现在是想停,很多时候并不是马上就停,等真正停的时候,键鼠还是会执行相应的动作。

我在测试最新代码和4.1版本的程序时都无法复现这个问题,不知道是否是由电脑性能导致的。😕

Monomux commented 2 years ago

但有个问题,那些与平台相关的插件依赖包该如何处理?比如windows下需要pywin32包,将这个与键鼠插件放一起吗?

目前打算针对不同的操作系统发布相应的程序,如windows下就用包含pywin32等的环境打包,其它系统用包含pynput等的环境打包。

ZutJoe commented 2 years ago

目前打算针对不同的操作系统发布相应的程序,如windows下就用包含pywin32等的环境打包,其它系统用包含pynput等的环境打包。

可行, 可是测试情况咋弄, 我只有一台windows设备😂

不是说pynput不好用, 转用pyautogui了嘛

Monomux commented 2 years ago

可行, 可是测试情况咋弄, 我只有一台windows设备😂

可以在虚拟机上测试

不是说pynput不好用, 转用pyautogui了嘛

我用了描述,实际上是监听用pynput,模拟控制用pyautogui

ZutJoe commented 2 years ago

可以在虚拟机上测试

虚拟机可以跑Linux相关系统, 但是Mac的可以跑吗

我用了描述,实际上是监听用pynput,模拟控制用pyautogui

好的, 我在尝试看您的跨平台代码, 还有好多东西需要学, 哈哈哈哈哈

Monomux commented 2 years ago

虚拟机可以跑Linux相关系统, 但是Mac的可以跑吗

我用virtualbox + mac镜像,可以跑

ZutJoe commented 2 years ago

我用virtualbox + mac镜像,可以跑

我去看看, 我怕我电脑到时候跑不动😂

Monomux commented 2 years ago

我在MacOS Monterey 12上测试了新的特性,程序需要root权限,鼠标的侧键被识别为鼠标中键,fn键无法捕获,其余功能正常。