pywin32模块 window相关操作

'''
深入:
问题一、消息发送  子窗口控件按钮定位 点击问题(暂行:改选消息参数为2)
问题二、消息发送  保存类型 下拉菜单的保存问题  ComboBox选项


使用:
win32手册
http://www.yfvb.com/help/win32sdk/index.htm?page=html/1.9t.qi.htm

win32api模块:
win32api.SendMessage(,,,)    参数:(目前窗口句柄,消息类型,消息参数,消息参数)


注意:
#PostMessage()  马上返回,不等待线程对详细的处理
#SendMessage()  处理完信息才返回
'''



import win32gui,win32api,win32con 
import os   

from pywinauto.application import Application
appN=Application()
appN.start('Notepad.exe')

window_title=u'无标题 - 记事本'





# =============================================================================
# #win32gui包  窗口、菜单等操作
# =============================================================================

#查找窗口句柄
dlgHandle = win32gui.FindWindow(None,window_title)               #查找窗口句柄   参数:(类名,标题),返回:句柄。
print(dlgHandle)                                                 #句柄  十进制
print('%x'%(dlgHandle))                                          #句柄  十六进制
print(win32gui.GetWindowText(dlgHandle))

#查找 当前鼠标位置 窗口句柄
dlgHandle1 = win32gui.WindowFromPoint(win32api.GetCursorPos())   #查找窗口句柄,通过当前鼠标位置
print(dlgHandle1)
print('%x'%(dlgHandle1))    
print(win32gui.GetWindowText(dlgHandle1))


#查找子窗口、查找下一个子窗口
subDlgHandle = win32gui.FindWindowEx(dlgHandle,0,'EDIT',None)                 #查找子窗口句柄  参数:(父窗口句柄,子窗口句柄,子窗口类名,子窗口标题)
subDlgHandle_2 = win32gui.FindWindowEx(dlgHandle,subDlgHandle,'EDIT',None)    #查找下一个子窗口句柄  参数:(父窗口句柄,子窗口句柄不为0则从此开始找下一个,子窗口类名,子窗口标题)


#获取窗口矩形位置、类名、标题。
ltrb = win32gui.GetWindowRect(dlgHandle)                         #获取窗口矩形位置    参数:(窗口句柄),返回:左上右下
clsname = win32gui.GetClassName(dlgHandle)                       #获取类名           参数:(句柄),返回:类名
title = win32gui.GetWindowText(dlgHandle)                        #获取标题           参数:(句柄),返回:标题名


#获取菜单栏句柄、菜单句柄、子菜单索引值
menuHandle = win32gui.GetMenu(dlgHandle)                         #获取菜单栏句柄           参数:(窗口句柄),返回:菜单栏句柄
subMenuHandle = win32gui.GetSubMenu(menuHandle,0)                #获取第几个菜单句柄       参数:(菜单栏句柄),返回:子菜单句柄
menuItemID = win32gui.GetMenuItemID(subMenuHandle,1)             #获取第几个子菜单索引值   参数:(菜单句柄),返回:子菜单句柄。  注意:分隔符是被编入索引的 


#自建函数  获取子菜单文本  
#参数:(菜单句柄,子菜单索引),返回:子菜单文本名称
def get_menu_item_txt(menu,idx):
    '''
    窗口菜单索引操作
    参数:(菜单句柄,子菜单索引),返回:子菜单文本名称
    '''
    import win32gui_struct
    
    mii,extra=win32gui_struct.EmptyMENUITEMINFO()    #新建一个win32gui的空结构体mii
    win32gui.GetMenuItemInfo(menu,idx,True,mii)      #将子菜单的内容获取到mii
    ftype, fstate, wid, hsubmenu, hbmpchecked, hbmpunchecked,dwitemdata, text, hbmpitem = win32gui_struct.UnpackMENUITEMINFO(mii) #解包mii
    print(text)
get_menu_item_txt(menuHandle,0)                      #自建函数显示子菜单名称    参数:(菜单句柄,子菜单索引),返回:子菜单文本名称
get_menu_item_txt(subMenuHandle,1)






# =============================================================================
# #win32con包  宏定义、消息类型等相关
# =============================================================================
'''
消息类型
作为参数传递进 发送消息 函数内部

'''

##发送消息执行操作  
##注意:
##PostMessage(,,,)  马上返回,不等待线程对详细的处理
##SendMessage(,,,)  处理完信息才返回

#输入文本操作  
#注意先定位文本框窗口
#注意参数设置:(1目标窗口句柄为文本窗口句柄,2消息类型,3消息的wParam参数,4消息的lParam参数为输入的文本内容)
win32api.SendMessage(subDlgHandle,win32con.WM_SETTEXT,None,'血皇敖天')         #输入文本操作    参数:(目标窗口句柄,消息类型,消息的wParam参数,消息的lParam参数)

#发送消息 点击子菜单操作
#注意参数设置:(1目标窗口句柄为 主窗口句柄,2消息类型,3消息的wParam参数为子菜单索引值,4消息的lParam参数)
win32api.PostMessage(dlgHandle,win32con.WM_COMMAND,menuItemID,0)             #点击子菜单操作  参数:(目标窗口句柄,消息类型,消息的wParam参数,消息的lParam参数)
win32api.Sleep(200)

win32api.PostMessage(subDlgHandle,win32con.WM_KEYDOWN,win32con.VK_RETURN,0)   #按下确认键
win32api.PostMessage(subDlgHandle,win32con.WM_KEYUP,win32con.VK_RETURN,0)     #松开确认键



'''
问题一、子窗口控件按钮定位 点击问题
win32gui.PostMessage(openDlgHandle,win32con.WM_COMMAND,2,quxiaoSubDlgHandle)
这里的 消息参数为1则点击的是打开按钮,改成2则窗口消息,也不知道是点击了什么。
'''
openDlgHandle=win32gui.FindWindow(None,'打开') 
print('%x'%openDlgHandle)
quxiaoSubDlgHandle=win32gui.FindWindowEx(openDlgHandle,0,None,'取消')
print('%x'%quxiaoSubDlgHandle)

win32api.Sleep(2000)
win32gui.PostMessage(openDlgHandle,win32con.WM_COMMAND,2,quxiaoSubDlgHandle)

win32gui.PostMessage(dlgHandle,win32con.WM_CLOSE,0,0)    #关闭窗口

appN['记事本']['不保存'].click()



# =============================================================================
# #win32api包  鼠标、消息框等操作
# =============================================================================
#获取鼠标位置、移动鼠标位置
#win32api.GetCursorPos()                                              #获取当前鼠标坐标
#win32api.SetCursorPos((500,500))                                     #设置鼠标坐标 移动鼠标位置


##鼠标点击
#win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,200,200,0,0)      #鼠标左键按下
#win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,200,200,0,0)        #鼠标左键抬起


#弹窗
#win32api.MessageBox(None,'hello,word','Title',win32con.MB_YESNO)     #创建一个弹窗









#下面开始示例内容:

# =============================================================================
# #示例:  避免重复性体力劳动
# #https://blog.csdn.net/seele52/article/details/17504925
# #https://blog.csdn.net/seele52/article/details/17542265
# #https://blog.csdn.net/seele52/article/details/17618615
# #https://blog.csdn.net/seele52/article/details/17723121
# =============================================================================
#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:])
#    
#    
#
##自建类 查找子窗口 索引子窗口
#class FaceGenWindow(object):
#    def __init__(self,fgFilePath=None):
#        self.Mhandle=win32gui.FindWindow('Notepad',None)   #主窗口句柄
#        
#        self.menu=win32gui.GetMenu(self.Mhandle)
#        self.menu=win32gui.GetSubMenu(self.menu,0)         #主窗口的菜单栏里索引子菜单
#        
#        print('Notepad initialization compeleted')
#        
#    
#    def menu_command(self,command):
#        '''
#        定义菜单操作的方法
#        参数:(对应command_dict里的key)
#        返回 弹出的对话框的句柄
#        返回 确定按钮的句柄
#        '''
#        command_dict={'open':[1,'打开'],
#                      'save_to':[3,'另存为'],
#                      }
#        
#        cmd_ID=win32gui.GetMenuItemID(self.menu,command_dict[command][0])    #子菜单标识
#        win32gui.PostMessage(self.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(self,fgFilePath):
#        '''
#        打开fg文件
#        '''
#        Mhandle,confirmBTN_handle=self.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(self,filePath,format='所有类型'):
#        format_dict={'txt':0,
#                     '所有类型':1
#                     }
#        
#        Mhandle,confirmBTN_handle=self.menu_command('save_to')               #调用类方法执行点击操作,返回弹出的窗口句柄、按钮
#        mhandle=find_subHandle(Mhandle,[('DUIViewWndClassName',0),('DirectUIHWND',0)])           
#        EDIT_handle=find_subHandle(mhandle,[('FloatNotifySink',0),('ComboBox',0),('Edit',0)])    #查找保存地址句柄
#        
#        PCB_handle=find_subHandle(mhandle,[('FloatNotifySink',1)])           #查找下拉菜单父窗口句柄
#        CB_handle=find_subHandle(PCB_handle,[('ComboBox',0)])                #查找下拉菜单窗口句柄
#        
##        wait_and_assert(EDIT_handle,find_subHandle(mhandle,[('FloatNotifySink',0),('ComboBox',0),('Edit',0)]))
#        
#        '''问题二、消息发送   保存类型 下拉菜单的保存问题(ComboBox选项)'''
#        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,1,os.path.abspath(filePath)) == 1:
#            return win32api.SendMessage(Mhandle,win32con.WM_COMMAND,1,confirmBTN_handle)
#        raise Exception('设置文件打开路径失败')
#        
#
##实例化对象
#notpad=FaceGenWindow()
#
##notpad.menu
##notpad.menu_command('open')
#
#notpad.open_fg('日常文本文档.txt')
#win32api.Sleep(1000)
#notpad.save_to('日常文本文档.jpg',format='所有类型')








  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值