python操纵电脑-点击图片\启动程序和进程

python的自动化

工作中有很多重复的操作,有些可以固化成程序来完成:
有个软件因为没有激活,会定期(5分钟左右)触发关闭按钮,导致程序无法使用。如果靠人工一直去点击也是不现实的。

想法1:点击屏幕某个位置的点

之前看过王者荣耀模拟器点击金币教学,固定位置的做法,虽然简单,但需要保证这个点位置在某个时间是确定的。暂时不考虑。

想法2:点击屏幕里与截图相同的地方

如果用原生语言,就连左右键、键盘输入转换码,这些基本功能都非常复杂,后来发现已融合到这个pyautogui库里:

pip install pyautogui

自动安装这个坑很多,还是去PyPI里下载好安装,有多个文件格式,安装在英文目录里,cmd运行即可;安的时候提示缺文件,还是再下载装了。

想要点击的东西,例如chrome图标,将其截图,保存在py文件目录。一定要用小写的png,今天被这个代码原文章坑了,它居然用大写

pyautogui的常用函数:

  1. locateCenterOnScreen,第一个参数是所需的图标截图,;第二个参数confidence是相似率,默认是1没有结果,太低的话返回会太多;
    输出结果传给单个变量的话,是Point格式,可用Click和doubleClick进行单击和双击。
import pyautogui
x = pyautogui.locateCenterOnScreen('chrome.png', confidence=0.9)
print(x)
pyautogui.doubleClick(x)

输出结果

Point(x=262, y=465)
  1. locateAllOnScreen,上面那个只返回一个结果的中心值,如果用All会返回所有,利用confidence控制所需的数量,for循环来获取每个结果,左上宽高四个值,通过.center获得中间值,即x和y坐标,除了像上面那种给一个值,还可以给x,y两个值
    click点击鼠标里传递这两个值,并有点击次数和左右键的选项
for pos in pyautogui.locateAllOnScreen('chrome.png', confidence=0.95):
    print(pos)
    x, y = pyautogui.center(pos)
    print('center()', x, y)
    pyautogui.click(x=x,y=y,clicks=1,button='left')

输出结果

Point(x=262, y=465)
Box(left=237, top=438, width=50, height=54)
center() 262 465
Box(left=237, top=439, width=50, height=54)
center() 262 466
Box(left=237, top=440, width=50, height=54)
center() 262 467

小例子:实现自动按计算器

x = [0]*4
x[0] = pyautogui.locateCenterOnScreen('3.png')
x[1] = pyautogui.locateCenterOnScreen('+.png')
x[2] = pyautogui.locateCenterOnScreen('4.png')
x[3] = pyautogui.locateCenterOnScreen('=.png')
print(x)
for i in range(4):
    pyautogui.click(x[i])

要将计算器的各个按钮截图保存下,重点看下数组的使用;

pyautogui截图对比,除了上面的OnScreen与屏幕比,还可以跟自定义图片比,由于用不到,这里就不展开了。

在上面打开chrome程序后,可以实现其他实现的功能:延时、快捷键ctrl和t新建页面,ctrl+l定位在地址栏,输入网址,按下两次回车键,截屏保存在程序文件夹

pyautogui.PAUSE = 2
pyautogui.hotkey('ctrl', 't')
pyautogui.hotkey('ctrl', 'l')
pyautogui.typewrite("www.dangdang.com")
pyautogui.keyDown('enter')
pyautogui.keyDown('enter')
pyautogui.PAUSE = 2
im2 = pyautogui.screenshot('my_screenshot.png')

想法3:将程序切换到前台

前面的问题是,如果程序在后台怎么切到前台,程序被挡了,图片对比无法正常使用…
有人推荐pywinauto,但是写的时候发现并没有这个函数…
from pywinauto.win32functions import SetForegroundWindow
这个暂时不研究了…

想法4:点击相应模块、做成可运行的小程序

如果操作电脑的步骤可以很明确的写出来,而且前提是这个程序就在桌面能看到的地方在运行,那之前的pyautogui还是很方便的,类似按键精灵吧。

我想到的例子是之前登陆网页版IP摄像机进行自动对焦,如果写出来什么时候干什么事,然后再进行循环,的确可以批量完成。但是这个最好还是可以通过调用硬件接口直接去进行控制,以后研究下。

当然如果还是想通过点击来实现,上次的图片对比面临两个问题:

  1. 想点击的东西被挡了,解决方法是输入程序路径,重开一个新的,或调用相应进程,直接操作;
  2. 当面临客户端而不是网页,客户端上面的按钮和输入框有好多重复的,图片很难区分,也很难进行定位;这时候如果能获取每个按钮和输入框的名字就可以直接操作啦。

连接程序

程序有两种类型backend:

  1. win32
  2. UIA
    可用spy++和inspect工具来测试,我用inspect,功能强大,任何的进程和模块都可以测出来。
    我测的类型都是UIA,即ControlType: UIA_WindowControlTypeId,原版教程有个测不出来类型的是win32型。
    python操纵电脑-点击图片\启动程序和进程_第1张图片

本次重点学习的库是pywinauto

通常的单进程用Application(),罕见的跨进程Desktop()暂不考虑,比如计算器

1:通过路径打开新的程序

其实这个原生的os就可以实现~u是unique的意思

import os
os.system(u"C:\\Windows\\System32\\notepad.exe")

os其他功能就不深究了,试了试都出不来,感觉是Windows不支持

pywinauto的实现方式

from pywinauto import Application
app = Application().start(r"C:\Program Files (x86)\Thunder Network\Thunder\Program\Thunder.exe")

成功打开迅雷

2:通过进程号连接已有程序

from pywinauto import Application
app = Application().connect(process=10276)

弊端是进程号每次重启都不固定
WIN7还是用inspect看,WIN10在任务管理器里有
进程号

3:通过句柄连接已有程序

app = Application().connect(handle=0x00250512)

模板里中间多了两个0,先按这样补00

弊端同上不稳定,查看只能用inspect
在这里插入图片描述

4:通过路径连接已有程序

app = Application().connect(path=r"C:\Program Files (x86)\Thunder Network\Thunder\Program\Thunder.exe")

跟第一个打开程序很像

5:通过标题和类型连接已有程序

app = Application().connect(title_re="截屏程序.*", class_name="TMainForm")

inspect上面都有,但是不是每个控件都有这些信息,要看具体看情况~
在这里插入图片描述
在这里插入图片描述

对菜单进行控制(待测试)

我们以截屏程序为例,在程序连接后(app),通过window选择窗体
便可按菜单进行操作,或通过快捷键进行操作

prt_sc = app.window(title='截屏程序’)
prt_sc.menu_select(r"文件->另存为")
或
prt_sc.type_keys('%TPR')

其中%代表ALT,一般像文字带括号,都是用ALT触发,例如:工具(T)笔(P)红笔(R);还可以用^代表快捷键CTRL,另存为是CTRL+S

对按钮\文本框\复选框进行控制

看上去很复杂,等明天整理下套路

打包成独立app

这个后续再看了…

你可能感兴趣的:(python)