按键精灵键盘脚本 Python模拟按键精灵
前言熟悉windows程序自动化的同学或是经常打游戏的同学应该知道“按键精灵”这款软件,它的主要功能是模拟鼠标键盘操作,对需要定时或不定时对某特定区域点击或发送某些命令时,这个软件十分有用,它中文化的编程模式虽然看起来有点怪异,但对于基本的循环判断都是有实现的,稍加修正也可以完成较复杂的任务。那么做为胶水语言的Python中有没有与这功能类似的第三方包呢?答案是肯定的,那就是pywinauto,从它的名字就可以看出,这是用python对windows进行自动化操作的工具包。注意:这个包只是在windows下使用!安装熟悉python第三方包安装的同学应该可以很容易用pip命令进行安装,即在命令行输入以下代码即可:
pip install pywinauto
pip命令会根据pywinauto的需求安装其相应依赖的包,比如pyWin32、comtypes、six、Pillow等,其中Pillow是可选的,在需要截图时会调用该包。基本用法在介绍用法之前,首先需要介绍一下pywinauto模块中两个名词:Dialog——指的是包含GUI元素比如按钮、编辑框等的一个窗口,它不一定是主窗口,可以是一个弹出式对话框;Control——指的是GUI元素,比如window、button、edit box等等。导入模块
from pywinauto.application import Application
import pywinauto.mouse as mouse
import pywinauto.keyboard as keyboard
启动一个程序启动软件可直接用Application的start()方法,比如我们来启动一下windows自带的记事本软件:
app = Application().start("c:/windows/system32/notepad.exe")
当运行上述代码时,我们可以立刻看到记事本软件被打开。访问对话框在打开记事本后,我们需要获取记事本的窗体,这时可以先来看一下,当前调用上述命令后启动的窗体有哪些:
app.windows()
输出:
[
1049854 >,
000001 CB287A0000:10000, 1573262>,
000001 CB287A0000:10000, 1049508>,
721494 >,
655836 >,
263078 >]
从打印的结果可以看出,伴随着记事本启动的还有几个输入法窗体,为了得到记事本窗体,需要调用以下代码:
dlg = app['无标题 - 记事本']
在这里为了得到记事本的窗体,必须要引用记事本当前的名字,这里的名字叫'无标题 - 记事本',因此我们在调用该窗体时,需要将该名字传递给app变量,当然如果文本文件的名字很长,我们可以用正则表达式来抓取:
dlg = app.window(title_re=".*记事本.*")
控件下一步就是要查明当前窗体有哪些可用的控件,这可用以下代码来打印:
dlg.print_control_identifiers()
从上述打印的信息,可以看出当前窗体的信息,注意每个窗体后面都有一些类似(L489, T504, R1734, B968)的信息,这是它的坐标位置(left, top, right, bottom)。
让我们通过程序调用记事本的菜单来将记事本的状态栏隐藏:
dlg.menu_select("查看 -> 状态栏")
如图所示,当上述代码运行后,记事本的状态栏就消失不见,当然再运行一次上述代码,其状态栏会重新显示。
我们下面演示一下调出记事本的替换窗口再将其取消,代码如下:
dlg.menu_select("编辑 -> 替换(R)")
app.window(title="替换")["取消"].click()
注意:上述代码调用时,要首先查找出弹出窗口,其次在弹出窗口中寻找取消按钮,再发送点击命令。下面我们再向记事本发送一些文本,比如在文本中写上:活着挺好。hello World!,代码如下:
dlg.Edit.type_keys("活着挺好。hello World!")
输出:
<win32_controls.EditWrapper - '活着挺好。helloWorld!', Edit, 459764>
当运行上述代码时,文字立刻会显示在记事本内,但我们注意到辅助卡盟,对于空格,并没有处理,这里需要将空格这样来写:
dlg.Edit.type_keys("活着挺好。hello{SPACE}World!")
输出:
'活着挺好。hello World!' , Edit, 459764>
这样一来就可以解决问题,不过在最新版的pywinauto中,type_keys增加了一些参数来指定空格输入,比如可以这样:
dlg.Edit.type_keys("活着挺好。hello World!", with_spaces=True)
输出:
'活着挺好。hello World!' , Edit, 459764>
但还有一点需要注意,如果在记事本打开时按键精灵键盘脚本,输入法默认是中文输入,那么有可能英文字母会被拦截,如下图:
这时要将输入法切换回英文状态,之所以出现这个情况是因为我这边安装的输入法是外挂式五笔输入法,它劫持了英文的输入。这一点在输入时,要注意。键盘和鼠标有时候,程序无法捕捉到控件,我们可以用键盘和鼠标来聚焦后,再发送文本,注意,这时发送是用keyboard来执行的send_keys命令,代码如下:
dlg.set_focus()
keyboard.send_keys("活着挺好。hello World!", with_spaces=True)
上述代码的执行就相当于电脑前的用户用鼠标点击窗体,再敲击键盘。
在前面我们已经介绍过控件的坐标问题,所以当想点击窗体某个区域时,可以用坐标来表示:
dlg.set_focus()
mouse.click(coords = (1000,80))
当运行上述代码时按键精灵键盘脚本,会看到窗体一闪,即意味着鼠标点击了窗体一下。捕捉图象捕捉图象是很方便的,下面给出一个演示:
dlg = app['无标题 - 记事本']
dlg.set_focus()
img1 = dlg.capture_as_image()
img1.save("1.png")
截图如下:
要注意,这段代码是基于本程序中的位置和长宽将程序中涉及到的窗体捕捉下来,但有可能包含其它窗体一些部分。为了解决这个问题,我们可以重新获取一下dlg即可。
小结本文对pywinauto这个python的第三方模块进行了简介,同学们可以看到使用该模块进行一些特定条件下的鼠标和键盘模拟是非常有用的,熟练掌握该模块,有助于我们工作效率的提升。
来源:【九爱网址导航www.fuzhukm.com】 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!