'''
深入:
问题一、消息发送 子窗口控件按钮定位 点击问题(暂行:改选消息参数为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='所有类型')
pywin32模块 window相关操作
最新推荐文章于 2023-10-10 17:36:35 发布