python+pywin32处理另存为弹出框保存文件

1.首先先定位该弹出框:

用spy++查找到该弹出框的标题和类名:


弹出框的句柄是每次都会变的,所以通过标题和类名获取该句柄:

# 获取另存为弹出框

calssname = u"#32770"

titlename = u"文件另存为"

hwnd = win32gui.FindWindow(calssname,titlename)

2.输入文件名

输入框定位在多层窗口的下面,所以我是一层一层往下找的,没找到便捷的方法

# 获取文件名输入框

a1 = win32gui.FindWindowEx(hwnd,None,"DUIViewWndClassName",None)

a2 = win32gui.FindWindowEx(a1,None,"DirectUIHWND",None)

a3 = win32gui.FindWindowEx(a2,None,"FloatNotifySink",None)

a4 = win32gui.FindWindowEx(a3,None,"ComboBox",None)

hwnd_filename = win32gui.FindWindowEx(a4,None,"Edit",None)

#在文件名输入框中输入文件名(fileName输入一个字符串,我根据系统需要生成的随机数,汉字的话需要转码,如u'你好'.encode('gbk'))

win32gui.SendMessage(hwnd_filename, win32con.WM_SETTEXT, None, fileName)

3.点击保存


# 点击保存按钮

hwnd_save = win32gui.FindWindowEx(hwnd,None,"Button",None)

win32gui.PostMessage(hwnd_save, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)

win32gui.PostMessage(hwnd_save, win32con.WM_KEYUP, win32con.VK_RETURN, 0)

以上在不需要修改保存路径的情况下可以直接保存文件

---------------------------------------------------------------------------------------------------------------------------

以下是未解决的问题

1.修改路径的问题(已解决),我猜想是通过两种方式,一是通过左边的树视图(SysTreeView32)来操作选择路径,二是通过在地址栏直接输入路径地址。其中第一种方法在网上没有查找到操作的方法,然后尝试第二种方法,找到路径地址输入框然后输入路径:


未点击地址栏时路径的窗口句柄是上图这样的
点击地址栏之后路径窗口句柄变成下图这样

a1 = win32gui.FindWindowEx(hwnd,None,"WorkerW",None)

a2 = win32gui.FindWindowEx(a1,None,"ReBarWindow32",None)

a3 = win32gui.FindWindowEx(a2,None,"Address Band Root",None)

a4 = win32gui.FindWindowEx(a3,None,"msctls_progress32",None)

a5 = win32gui.FindWindowEx(a4,None,"Breadcrumb Parent",None)

hwnd_filepath1 = win32gui.FindWindowEx(a5,None,"ToolbarWindow32",None)

print "-----hwnd_filepath1------",hwnd_filepath1

先找到到上图路径栏句柄(查找成功),然后按回车,使地址栏变成可输入状态

win32gui.PostMessage(hwnd_filepath1, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0)

win32gui.PostMessage(hwnd_filepath1, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, 0)

在通过路径查找

a11 = win32gui.FindWindowEx(hwnd,None,"WorkerW",None)

a21 = win32gui.FindWindowEx(a11,None,"ReBarWindow32",None)

a31 = win32gui.FindWindowEx(a21,None,"Address Band Root",None)

a41 = win32gui.FindWindowEx(a31,None,"msctls_progress32",None)

a6 = win32gui.FindWindowEx(a41,None,"ComboBoxEx32",None)

a7 = win32gui.FindWindowEx(a6,None,"ComboBox",None)

hwnd_filepath = win32gui.FindWindowEx(a7,None,"Edit",None)

print "-----hwnd_filepath------",hwnd_filepath

到这一步查找句柄返回值变成0,就是没查找到路径编辑框,没有找到原因,代码运行下来路径那里只是能看到的效果点击了一下,但是不会变成输入框状态,但是把鼠标移上去会变成输入的状态

这样是可输入的状态

然后win32gui.SendMessage(hwnd_filepath, win32con.WM_SETTEXT, None, 'C:\Users\Administrator\Desktop')这样地址就输入不进去,原因不明

视图数操作的方法没有找到

2.取消按钮的点击无效(已解决)

保存按钮
取消按钮

保存和取消的类名都是“Button”,所以通过保存按钮查找到下一个Button就是取消

hwnd_cancle = win32gui.FindWindowEx(hwnd,hwnd_save,"Button",None)

print "------hwnd_cancle---",hwnd_cancle

取消句柄获取到了,通过下面的方法打印出来的父句柄和保存按钮是一样的都是另存为这个弹出框

print win32gui.GetParent(hwnd_cancle)

下面两行代码也获取到了取消的类名和标题打印出来的是‘Button’和‘取消’

print win32gui.GetClassName(hwnd_cancle)

print win32gui.GetWindowText(hwnd_cancle).decode('gbk').encode('utf-8')

以下两行代码点击取消按钮的时候,弹出框不关闭,然后发现点击的是保存按钮,原因不明

win32gui.PostMessage(hwnd_cancle, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)

win32gui.PostMessage(hwnd_cancle, win32con.WM_KEYUP, win32con.VK_RETURN, 0)

以上是完成的两点和处理失败的两点,做出来是个半成品,win32gui这方面的知识对我来说有点难,在python中安装的pywin32自带了一个API,里面的描述方法很简单,不够详细,很多看不太懂,以后还需要再花时间慢慢研究

--------------------------------------------------------------------------------------------

问题1的解决方法:

# 修改成指定路径

win_1 = win32gui.FindWindowEx(hwnd, None,"WorkerW",None)

win_2 = win32gui.FindWindowEx(win_1, None,"ReBarWindow32",None)

win_3 = win32gui.FindWindowEx(win_2, None,"Address Band Root",None)

win_4 = win32gui.FindWindowEx(win_3, None,"msctls_progress32",None)

left, top, right, bottom = win32gui.GetWindowRect(win_4)

win32api.SetCursorPos([left,top])

win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)

# 将路径复制到剪切板

win32clipboard.OpenClipboard()

win32clipboard.EmptyClipboard()

win32clipboard.SetClipboardText(filePath)

win32clipboard.CloseClipboard()

# 按下ctrl+v

win32api.keybd_event(0x11, 0, 0, 0)

win32api.keybd_event(0x56, 0, 0, 0)

win32api.keybd_event(0x56, 0, win32con.KEYEVENTF_KEYUP, 0)

win32api.keybd_event(0x11, 0, win32con.KEYEVENTF_KEYUP, 0)

# 按回车进入该路径

win32api.keybd_event(0x0D,0,0,0)

问题2取消按钮点击的问题已经解决:

# 点击取消按钮,用鼠标点击点击取消按钮,上面使用键盘按键不行,原因不明

hwnd_cancel = win32gui.FindWindowEx(hwnd,hwnd_save,"Button",None)

left, top, right, bottom = win32gui.GetWindowRect(hwnd_cancel)#该方法接收值必须为4个

win32api.SetCursorPos([left+35,top+13])

win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)

win32gui.GetWindowRect方法描述:Returns the rectangle for a window in screen coordinates。应该返回该句柄控件的四个顶点坐标吧

win32api.SetCursorPos方法描述:The SetCursorPos function moves the cursor to the specified screen coordinates.将光标移动到指定的屏幕坐标。

-----------------------------------------------------------------------------------------------

查找另存为弹出框下的所有子句柄:

hwndChildList = []

win32gui.EnumChildWindows(hwnd, lambda hwnd1, param: param.append(hwnd1),  hwndChildList)

for a in hwndChildList:

print win32gui.GetParent(a)

print win32gui.GetClassName(a)

print win32gui.GetWindowText(a).decode('gbk').encode('utf-8')

print "-----hwnd_save------",a

另外,经同事推荐ViewWizard工具比spy++更轻便快捷,查看父句柄也比之更方便

按键控制查询:http://www.mamicode.com/info-detail-1319197.html


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348