如何使⽤Python⾃动控制windows桌⾯
前⾔
在使⽤PC时与PC交互的主要途径是看屏幕显⽰、听声⾳,点击⿏标和敲键盘等等。在⾃动化办公的趋势下,繁琐的⼯作可以让程序⾃动完成。⽐如⾃动化测试、⾃动下单交易等。很多软件除了可以GUI⽅式操作外还可以⽤CLI接⼝操作,不过当⼀些软件未提供CLI接⼝时,我们应该怎么办呢?我们还可以⽤程序控制桌⾯上的窗⼝、模拟点击⿏标或按下键盘等动作来释放⾃⼰。
pywin32是⼀个Python库,它为Python提供访问Windows API的扩展,提供了齐全的windows常量、接⼝、线程以及COM机制等等,安装后会⾃带⼀个pythonwin的IDE。接下来主要介绍下如何通过Python去操作windows桌⾯软件。
1、打开软件或⽂件
⽐如打开⼀个⾕歌浏览器,或者打开⼀个word⽂件,如下所⽰:
win32api.ShellExecute(1, 'open',
r'C:Program Files (',
'', '', 1)
win32api.ShellExecute(1, 'open',
r'C:UsersJayDesktopEnvironment Guider.docx',
'', '', 1)
win32api.ShellExecute()的参数主要包括:
HWND:指定⽗窗⼝句柄
Operation:指定动作,譬如"edit",“explore”,“open”,“find”,“print”,“NULL”
FileName:指定要打开的⽂件或程序
Parameters:指定打开程序所需参数
Directory:缺省⽬录
ShowCmd:打开选项,可选值:
SW_HIDE = 0; {隐藏窗⼝,活动状态给令⼀个窗⼝}
SW_SHOWNORMAL = 1; {⽤最近的⼤⼩和位置显⽰窗⼝, 同时令其进⼊活动状态}
SW_NORMAL = 1; {⽤当前的⼤⼩和位置显⽰⼀个窗⼝,不改变活动窗⼝}
SW_SHOWMINIMIZED = 2; {最⼩化窗⼝,并将其激活}
SW_SHOWMAXIMIZED = 3; {最⼤化窗⼝,并将其激活}
SW_MAXIMIZE = 3; {同 SW_SHOWMAXIMIZED}
SW_SHOWNOACTIVATE = 4; {⽤最近的⼤⼩和位置显⽰⼀个窗⼝,不改变活动窗⼝}
SW_SHOW = 5; {⽤当前的⼤⼩和位置显⽰⼀个窗⼝,令其进⼊活动状态}
SW_MINIMIZE = 6; {最⼩化窗⼝, 不激活}
SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE}
SW_SHOWNA = 8; {⽤当前的⼤⼩和位置显⽰⼀个窗⼝,不改变活动窗⼝}
SW_RESTORE = 9; {同 SW_SHOWNORMAL}
SW_SHOWDEFAULT = 10; {同 SW_SHOWNORMAL}
SW_MAX = 10; {同 SW_SHOWNORMAL}
执⾏成功会返回应⽤程序句柄,如果返回值 <= 32,则表⽰执⾏错误。返回值可能的错误有:
0—— {内存不⾜}
python怎么读取桌面上的文件2—— {⽂件名错误}
3—— {路径名错误}
11—— {EXE ⽂件⽆效}
26—— {发⽣共享错误}
27—— {⽂件名不完全或⽆效}
28—— {超时}
29—— {DDE 事务失败}
30—— {正在处理其他 DDE 事务⽽不能完成该 DDE 事务}
31—— {没有相关联的应⽤程序}
2、查窗体的句柄
在win32编程的世界⾥,包括窗⼝到⽂本框的所有控件都是窗体,所有的窗体都有独⽴的句柄。要操作任意⼀个窗体,都需要到这个窗体的句柄。句柄是⼀个32位整数,在windows中⽤于标记对象。⽐如查Snipping Tool和New 的句柄,如下所⽰:
para_hld = win32gui.FindWindow(None, "Snipping Tool")# 1836416
para_hld = win32gui.FindWindow(None, "New - Notepad")# 591410
win32gui.FindWindow()属于win32gui的模块,它⾃顶层窗⼝(也就是桌⾯)开始搜索条件匹配的窗体,并返回这个窗体的句柄。该函数仅能查主窗⼝,因此⽆法搜索⼦窗⼝,也不区分⼤⼩写,未到则返回0。
win32gui.FindWindow()的参数主要包括 (lpClassName=None, lpWindowName=None):
lpClassName:字符型,窗体的类名,可以在Spy++⾥到
lpWindowName:字符型,窗⼝名,也就是标题栏上能看见的那个标题。
3、查句柄的类名和标题
⽐如通过Snipping Tool和New 的句柄查对应的类名和标题,如下所⽰:
title = win32gui.GetWindowText(1836416)
classname = win32gui.GetClassName(1836416)
print "windows handler:{0}; title:{1}; classname:{2}".format(1836416, title, classname)
打印显⽰如下:
windows handler:1836416; title:Snipping Tool; classname:Microsoft-Windows-Tablet-SnipperToolbar
title = win32gui.GetWindowText(591410)
classname = win32gui.GetClassName(591410)
print "windows handler:{0}; title:{1}; classname:{2}".format(591410, title, classname)
打印显⽰如下:
windows handler:591410; title:New - Notepad; classname:Notepad
4、调⽤win32gui.EnumWindows()枚举所有窗⼝句柄
直到最后⼀个顶层窗⼝被枚举则停⽌枚举过程。如下所⽰:
hWndList = []
win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWndList)
print hWndList
for hwnd in hWndList:
title = win32gui.GetWindowText(hwnd)
print title
打印显⽰如下:
[852802L, 65946L, 65928L, 65930L, 65900L, 65920L, 65924L, 65922L, 65944L, 65892L, 65886L, 6817870L, 65960L, 6031410L, …… 66052L, 65734L]……
New - Notepad
Snipping Tool
DDE Server Window
OfficePowerManagerWindow
OfficePowerManagerWindow
DDE Server Window
GDI+ Window
Global Internet Access
……
5、win32gui.SetForegroundWindow()函数将指定窗体设置到最顶层,并且激活该窗⼝
构造函数为:win32gui.SetWindowPos(HWN hWnd,HWND hWndlnsertAfter, int X,int Y, int cx,int cy, UNIT.Flags)
关于win32gui.SetForegroundWindow(para_hld)报错的问题:
<: (0, ‘SetForegroundWindow', ‘No error message is available')
其实调⽤SetForegroundWindow()会有很多限制,参考官⽹的
因此调⽤SetForegroundWindow()时需要查看当前运⾏的条件是否符合上述要求,此处在调⽤SetForegroundWindow()前事先发送⼀个键盘event来解决该问题。
例程如下所⽰:
win32api.keybd_event(13, 0, 0, 0) #
win32gui.SetForegroundWindow(para_hld)
6、win32api.keybd_event()模拟键盘输⼊
构造函数如下所⽰:
win32api.keybd_event (bVk, bScan, dwFlags, dwExtraInfo)
bVk:虚拟键码(键盘键码对照表见附录);
bScan:硬件扫描码,⼀般设置为0即可;
dwFlags:函数操作的⼀个标志位,如果值为KEYEVENTF_EXTENDEDKEY则该键被按下,也可设置为0即可,如果值为KEYEVENTF_KEYUP则该按键被释放;
dwExtraInfo:定义与击键相关的附加的32位值,⼀般设置为0即可。
按下enter键后抬起的例程如下所⽰:
win32api.keybd_event(13,0,0,0) # enter
win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0) #释放按键
7、模拟⿏标输⼊
直接给出例程,如下所⽰:
# 获取⿏标当前位置的坐标
print win32api.GetCursorPos()
# 将⿏标移动到坐标处
win32api.SetCursorPos((100, 100))
# 左点击
time.sleep(2)
8、关于⿏标键盘的操作还可以使⽤PyUserInput库
PyUserInput是⼀个使⽤python的跨平台的操作⿏标和键盘的模块,使⽤⾮常⽅便。⽀持的平台及依赖如下:Linux - Xlib
Mac - Quartz, AppKit
Windows - pywin32, pyHook
实例化⼀个⿏标和键盘对象,如下所⽰:
from pymouse import PyMouse
from pykeyboard import PyKeyboard
m = PyMouse()
k = PyKeyboard()
操作⿏标和键盘,如下所⽰:
m.click(190,70,1)#移动并且在xy位置点击
time.sleep(2)
m.click(190, 200, 1)#移动并且在xy位置点击
time.sleep(2)
k.tap_key(k.function_keys[5])#–点击功能键F5
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论