版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
# -*- coding: utf-8 -*-
'''
深入:
问题一、消息发送 保存类型 下拉菜单的保存问题(ComboBox选项)
https://blog.csdn.net/seele52/article/details/17723121
参考:
(win32手册)
http://www.yfvb.com/help/win32sdk/index.htm?page=html/1.9t.qi.htm
(SendMessage发送消息 API)
http://www.yfvb.com/help/win32sdk/index.htm?page=html/1724msn.htm
(CB_SETCURSEL设置下拉菜单 消息类型)
http://www.yfvb.com/help/win32sdk/index.htm?page=html/22i4e47.htm
(WM_COMMAND点击等 消息类型)
http://www.yfvb.com/help/win32sdk/index.htm?page=html/71v.3j.htm
(CBN_SELENDOK当用户选择列表项目时,发送CBN_SELENDOK通知消息,或者选择一个项目,然后关闭该列表。表示用户的选择将被处理。组合框的父窗口通过WM_COMMAND消息收到此通知消息。)
http://www.yfvb.com/help/win32sdk/index.htm?page=html/315z0ja.htm
(CBN_SELCHANGE当组合框的列表框中的选择即将被更改时,CBN_SELCHANGE通知消息被发送,这是由于用户单击列表框或使用箭头键更改选择的结果。组合框的父窗口通过WM_COMMAND消息接收此消息。)
http://www.yfvb.com/help/win32sdk/index.htm?page=html/_jwjeb.htm
使用:
#自建函数 寻找父窗口下的类中的子窗口(通过索引)
#自建函数 递归寻找最终子窗口句柄(通过列表传入路径形式:类名索引)
#自建函数 点击、打开、另存为
'''
import win32gui,win32api,win32con
import os
from pywinauto.application import Application
appN=Application()
appN.start('Notepad.exe')
#自建函数 寻找父窗口下的类中的子窗口(通过索引)
def find_idxSubHandle(pHandle,winClass,index=0):
'''
自建函数 寻找子窗口句柄 窗口类名中的 索引子窗口的句柄
参数:(父窗口句柄,窗口类名,索引)
'''
assert type(index) == int and index >=0
handle=win32gui.FindWindowEx(pHandle,0,winClass,None)
while index>0:
handle=win32gui.FindWindowEx(pHandle,handle,winClass,None)
index-=1
return handle
#自建函数 递归寻找最终子窗口句柄(通过列表传入路径形式:类名索引)
def find_subHandle(pHandle,winClassList):
'''
自建函数 递归寻找最终子窗口句柄(通过列表传入路径形式:类名索引)
参数:(父窗口句柄,各个子窗口的cLass列表)
[[类名,索引],[子类名,索引]]
'''
assert type(winClassList) == list
if len(winClassList)==1:
return find_idxSubHandle(pHandle,winClassList[0][0],winClassList[0][1])
else:
pHandle=find_idxSubHandle(pHandle,winClassList[0][0],winClassList[0][1])
return find_subHandle(pHandle,winClassList[1:])
def menu_command(command):
'''
定义菜单操作的方法
参数:(对应command_dict里的key)
返回 弹出的对话框的句柄
返回 确定按钮的句柄
'''
Mhandle=win32gui.FindWindow('Notepad',None) #主窗口句柄
menu=win32gui.GetMenu(Mhandle)
menu=win32gui.GetSubMenu(menu,0)
command_dict={'open':[1,'打开'],
'save_to':[3,'另存为'],
}
cmd_ID=win32gui.GetMenuItemID(menu,command_dict[command][0]) #子菜单标识
win32gui.PostMessage(Mhandle,win32con.WM_COMMAND,cmd_ID,0) #发送消息给子菜单
for i in range(10):
if win32gui.FindWindow(None,command_dict[command][1]): #如果寻找到窗口 通过标题
break
else:
win32api.Sleep(200) #等待200毫秒 ,后继续循环10次来尝试寻找窗口
dlg_handle=win32gui.FindWindow(None,command_dict[command][1]) #点击打开后的窗口 标题为 打开
confBTN_handle=win32gui.FindWindowEx(dlg_handle,0,'Button',None) #打开窗口 上的 按钮
return dlg_handle,confBTN_handle #返回:弹出窗口句柄、子窗口确定按钮的句柄
def open_fg(fgFilePath):
'''
打开fg文件
'''
Mhandle,confirmBTN_handle=menu_command('open') #调用类方法执行点击操作,返回弹出的窗口句柄、按钮。
handle=find_subHandle(Mhandle,[('ComboBoxEx32',0),('ComboBox',0),('Edit',0)])
if win32api.SendMessage(handle,win32con.WM_SETTEXT,0,os.path.abspath(fgFilePath))==1:
return win32api.SendMessage(Mhandle,win32con.WM_COMMAND,1,confirmBTN_handle)
raise Exception('文件打开路径设置失败')
def save_to(filePath,format='所有类型'):
format_dict={'txt':0,
'所有类型':1
}
Mhandle,confirmBTN_handle=menu_command('save_to') #调用类方法执行点击操作,返回弹出的窗口句柄、按钮
mhandle=find_subHandle(Mhandle,[('DUIViewWndClassName',0),('DirectUIHWND',0)])
print('%x'%mhandle)
EDIT_handle=find_subHandle(mhandle,[('FloatNotifySink',0),('ComboBox',0),('Edit',0)]) #查找保存地址句柄
PCB_handle=find_subHandle(mhandle,[('FloatNotifySink',1)]) #查找下拉菜单父窗口句柄 注意:列表内索引值根据系统不同有偏差
print('%x'%PCB_handle)
CB_handle=find_subHandle(PCB_handle,[('ComboBox',0)]) #查找下拉菜单窗口句柄
# wait_and_assert(EDIT_handle,find_subHandle(mhandle,[('FloatNotifySink',0),('ComboBox',0),('Edit',0)]))
if win32api.SendMessage(CB_handle,win32con.CB_SETCURSEL,format_dict[format],0) == format_dict[format]:
win32api.SendMessage(PCB_handle,win32con.WM_COMMAND,0x90000,CB_handle) #父窗口发生变化 需要发送指定高位数
win32api.SendMessage(PCB_handle,win32con.WM_COMMAND,0x10000,CB_handle) #父窗口发生变化 需要发送指定低位数
else:
raise Exception('更改保存类型失败')
if win32api.SendMessage(EDIT_handle,win32con.WM_SETTEXT,0,os.path.abspath(filePath)) == 1:
return win32api.SendMessage(Mhandle,win32con.WM_COMMAND,1,confirmBTN_handle)
raise Exception('设置文件打开路径失败')
open_fg('日常文本文档.txt')
win32api.Sleep(1000)
save_to('日常文本.jpg')