pywin32模块 自建函数相关

# -*- 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')










  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pywin32模块是Python中的一个第三方库,提供了访问Windows API的接口,允许Python程序员在Windows环境中编写使用Windows API的应用程序。下面列举了pywin32模块的一些主要功能: 1. 处理Windows COM:pywin32模块提供了访问Windows COM(Component Object Model)的接口,使Python程序员可以使用COM对象。 2. 访问Windows API:pywin32模块提供了访问Windows API的接口,允许Python程序员调用Windows API函数。 3. 操作Windows窗口:pywin32模块提供了操作Windows窗口的接口,允许Python程序员创建、关闭、激活和移动窗口,以及获取当前活动窗口的句柄。 4. 操作Windows剪贴板:pywin32模块提供了操作Windows剪贴板的接口,允许Python程序员读取和写入剪贴板数据。 5. 操作Windows注册表:pywin32模块提供了操作Windows注册表的接口,允许Python程序员读取和写入Windows注册表的键和值。 6. 操作Windows服务:pywin32模块提供了操作Windows服务的接口,允许Python程序员启动、停止和查询Windows服务的状态。 7. 操作Windows文件系统:pywin32模块提供了操作Windows文件系统的接口,允许Python程序员创建、删除、复制和移动文件和目录,以及获取文件和目录的属性信息。 总之,pywin32模块为Python程序员提供了访问Windows API的接口,使他们能够在Windows环境中编写更加高效和强大的应用程序。使用pywin32模块,Python程序员可以操作Windows COM、Windows API、Windows窗口、Windows剪贴板、Windows注册表、Windows服务和Windows文件系统等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值