pywin32常⽤模块函数⽤法整理
Win32gui: Windows图形界⾯接⼝模块。主要负责操作窗⼝切换以及窗⼝中元素id标签的获取
Win32api: Windows开发接⼝模块。主要负责模拟键盘和⿏标操作,对win32gui获取的标签进⾏点击/获取值/修改值等操作Win32con:全⾯的库函数,提供Win32gui和Win32api需要的操作参数
Win32gui 函数
FindWindow
hld=win32gui.FindWindow(ClassName,Title)
ClassName:窗⼝的类名
Title:窗⼝的标题名称,即左上⾓的⽂字描述信息
hld:返回结果为当前窗⼝的句柄信息,
以下是使⽤AutoItv3抓取的Windows【另存为】窗⼝信息:
hld=win32gui.FindWindow("#32770",u"另存为")
>>>> Window <<<<
Title: 另存为 #这⾥就是上⾯的Title
Class: #32770 #这⾥就是上⾯的ClassName
Position: 0, 0
Size: 680, 480
Style: 0x96CC02C4
ExStyle: 0x00010101
Handle: 0x001E03A0 #这⾥就是上⾯函数返回值
SetForegroundWindow
win32gui.SetForegroundWindow(hld)
hld:为上⾯获取到的窗⼝句柄信息
主要⽤于激活该窗⼝,此时窗⼝会是最前⾯⼀层
在到窗⼝句柄后,需要先将窗⼝设置为最前⾯⼀层才能模拟⿏标键盘操作当前窗⼝上的元素。FindWindowEx
win32gui. FindWindowEx(hld,Child, ClassName, Title)
hld:⽬标窗⼝的⽗窗⼝,也是上⾯获取到的窗⼝句柄信息。通过⽗向下⼦
Child:⽬标窗⼝的⼦窗⼝。通过⼦向上⽗,从⽽到⽬标窗⼝
ClassName:⽬标窗⼝的类名
Title:⽬标窗⼝的标题名称,即⽂字描述信息
以下是使⽤AutoItv3抓取的Windows【另存为】窗⼝的【保存】按钮信息:
button=win32gui.FindWindowEx(hld,None, "Button",None)
>>>> Control <<<<
Class: Button #这⾥就是上⾯的ClassName
Instance: 1
ClassnameNN: Button1
Name:
Advanced (Class): [CLASS:Button; INSTANCE:1]
ID: 1
Text: 保存(&S) #这⾥就是上⾯的Title
Position: 459, 400
Size: 88, 30
ControlClick Coords: 45, 26
Style: 0x50030000
ExStyle: 0x00000004
Handle: 0x000C12A2 #这⾥就是上⾯函数返回值
GetDlgItem
button=win32gui.GetDlgItem(hld,ID)
hld:⽬标窗⼝的⽗窗⼝,也是上⾯获取到的窗⼝句柄信息。通过⽗向下⼦
ID: ⽬标窗⼝ID
上⾯的例⼦,使⽤ID来抓取Windows【另存为】窗⼝的【保存】按钮信息为:
button=win32gui. GetDlgItem (hld,1)
注:需要确保,多次打开窗⼝时⽬标窗⼝ID是不变的,才能准确获取⽬标窗⼝句柄
sendmessage返回值SendMessage
SendMessage(hWnd, Msg, wParam, lParam)
hWnd:接收消息的窗体句柄
Msg:要发送的消息,这些消息都是windows预先定义好的,可以参见
wParam:消息的wParam参数
lParam:消息的lParam参数
注:系统定义消息中不同消息分别有相应的参数:wParam和lParam,可查询官⽹参数详情:
以 WM_KEYDOWN消息为例:
wParam:虚拟键参数
lParam:重复次数
win32gui.SendMessage(hld,win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
Enter键重复0次
【另存为】窗⼝点击【保存】按钮的⽅法:
1)⽅法1:发送消息⽬标à【保存】按钮;动作à点击
win32gui.SendMessage(button,win32con.BM_CLICK) # win32con后⾯会解释
2)⽅法2:发送消息⽬标à整个窗⼝;动作à按键按下;动作参数àEnter键;前提à窗⼝聚焦默认在【保存】按钮时win32gui.SendMessage(hld,win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.PostMessage(hld,win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
为什么PostMessage成功了SendMessage失败了?
PostMessage
PostMessage(hWnd, Msg, wParam, lParam)
参数和使⽤⽅法同SendMessage。
不同的是,PostMessage只将消息放⼊待执⾏消息队列,不等待处理和返回,只要放⼊队列即算执⾏完毕。⽽SendMessage需要等待执⾏处理完后,才继续,返回的是其他程序处理后的返回值。
GetWindowRect
left,top,right,bottom=win32gui.GetWindowRect(hld)
获取某元素hld位置。left,top分别指与屏幕左上⾓距离,right,bottom 指长和⾼。
MoveWindow
win32gui.MoveWindow(hld, int X, int Y, int nWidth, int nHeight, BOOL bRepaint )
移动某窗⼝hld到指定位置。
x,y指与屏幕左上⾓距离,nWidth, nHeight 指长和⾼
bRepaint :是否重绘
GetCursorPos
POS =win32gui. GetCursorPos()
获取当前⿏标点击的窗⼝元素的坐标
WindowFromPoint
edit=win32gui.WindowFromPoint(POS)
获取包含指定点的窗⼝句柄,即根据坐标获取元素句柄
以上坐标和⿏标操作应⽤场景:【另存为】页⾯修改⽂件名
edit=win32gui.FindWindEx(hld,None,"Edit",None)
edit=win32gui. GetDlgItem (hld,1001)
以上均定位失败,使⽤⿏标和坐标位移⽅法获取⽂件名输⼊框的句柄
hld=win32gui.FindWindow(u'#32770',u"另存为")
win32gui.SetForegroundWindow(hld)
#为保证每次打开时⽬标框所在屏幕坐标不变,在这⾥将另存为窗⼝坐标和⼤⼩
写死
win32gui.MoveWindow(hld,0,0,798,537,False)
win32api.SetCursorPos((200,355))
edit=win32gui.WindowFromPoint(200,355)
win32api.SendMessage(edit,win32con.WM_SETTEXT,None,"abc")
Win32api函数
SendMessage PostMessage GetCursorPos等win32api与win32gui均包含的函数,⽤法也相同。
keybd_event
keybd_event(bVk, bScan, dwFlags , dwExtraInfo)
bVk:为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab其他键值具体参考如下:
(注意转换16进制)
bScan:为扫描码,⼀般不⽤设置,⽤0代替就⾏
dwFlags:为选项标志,如果为keydown则置0即可,如果为keyup则设成"KEYEVENTF_KEYUP"
dwExtraInfo:点击键关联的附加数据,⼀般置0即可
win32api.keybd_event(18,0,0,0) #按下ALT键,按下后不会弹起
win32api.keybd_event(18,0, win32con.KEYEVENTF_KEYUP,0) #⼿动点上键结束点击
mouse_event
mouse_event( dwFlags, dx, dy, cButtons, dwExtraInfo)
dwFlags:控制⿏标移动和点击按钮的各个⽅⾯。可以是下列值的某些组合:
MOUSEEVENTF_ABSOLUTE,MOUSEEVENTF_LEFTDOWN,MOUSEEVENTF_MIDDLEUP等
dx:⿏标的位置沿x轴的位移
dy:⿏标的位置沿y轴的位移
cButtons: 与⿏标事件关联的附加值,在这⾥不关注
dwExtraInfo: 与⿏标事件关联的附加值,在这⾥不关注
SetCursorPos
win32api.SetCursorPos(x,y)
将光标移到屏幕坐标(x,y)处
RegOpenKey
win32api.RegOpenKey(hKey,ipSubKey,phkResult)
打开给定键,⼀般是打开⼀个现有的注册表项
hKey :要打开键的句柄,即注册表最外层名称
lpSubKey:要打开的项名,即项具体路径名称
phkResult:指定⼀个变量,⽤于装载(保存)打开注册表项的⼀个句柄
打开endpoint注册表:
endpoint_key=win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE,'SOFTWARE\Ixia Communications\Endpoint',0, win32con.KEY_READ) #最后⼀个参数指权限为读
RegQueryValueEx
win32api.RegQueryValueEx(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData)
检索⼀个已打开的注册表句柄中,指定的注册表键的类型和设置值。
HKEY hKey:⼀个已打开项的句柄,即RegOpenKey打开的注册表项的句柄
LPCTSTR lpValueName:要查询注册表键值的名字字符串,注册表键的名字,以空字符结束。
LPDWORD lpReserved:未⽤,设为零
LPDWORD lpType:⽤于装载取回数据类型的⼀个变量
LPBYTE lpData:⽤于装载指定值的⼀个缓冲区
LPDWORD lpcbData:⽤于装载lpData缓冲区长度的⼀个变量。 //⼀旦返回,它会设为实际装载到缓冲区的字节数
install_path = win32api.RegQueryValueEx(endpoint_key,'Installation Directory')
如图最终根据键值名字' Installation Directory'得到返回值 'C:\Program Files\Ixia\Endpoint\'
RegCloseKey
RegCloseKey(hKey)
不使⽤时,关闭注册表。
win32api.RegCloseKey(endpoint_key)
Win32con 函数
Win32con函数⼀般作为win32gui win32api的参数调⽤。其参数命名可以这样理解:Obj_Opt
WM_COMMAND
win32api.SendMessage(hld, win32con.WM_COMMAND, (9<<16)+ctrl_id, vHandle)
发送命令(9<<16)+ctrl_id 给窗⼝hld,命令要操作的窗⼝对象是vHandle
WM_XXXXXX:Window Message即窗⼝消息对应的操作
CB_GETCOUNT
count=win32api.SendMessage(vHandle, win32con.CB_GETCOUNT,0,0)
# vHandle是⼀个ComboBox, 通过发送CB_GETCOUNT消息获取的此下拉列表框可选值个数
CB_XXXXXX:ComboBox对象对应的操作
HKEY_LOCAL_MACHINE
endpoint_key=win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE,'SOFTWARE\Ixia Communications\Endpoint',0, win32con.KEY_READ)
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_XXXXXX:注册表对应的操作
KEY_ALL_ACCESS
xml_key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE,'SOFTWARE\\
Microsoft\\Office\\MSXML60',0, win32con.KEY_ALL_ACCESS)
KEY_XXXXXX:理解为附加参数。在这⾥指打开注册表权限为全部
KEYEVENTF_KEYUP
win32api.keybd_event(69,0,win32con.KEYEVENTF_KEYUP,0)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论