pywin32模块 自建函数相关

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44015805/article/details/98800774
# -*- 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')










猜你喜欢

转载自blog.csdn.net/weixin_44015805/article/details/98800774